template学习之零值初始化及字符串常量作(function template argument)函数模版参数问题
2013-07-26 20:59
281 查看
本篇只是摘抄自《c++ template》小问题比较少注意,而且也容易忘记
1 零值初始化
对于基本的数据类型int,double,pointer type来说,一般没有default构造式对其初始化,比如下面的代码
void foo(){
int x;
//x的值不定
int *ptr;
//ptr的指向也不定
}
如果在template中使用这样的代码,如下
template <typename T>
void foo(){
T x;
}
如果上面的的T是基本数据类型时,x的值就没有初始化,所以这样的方法是不能保证值一定被初始化的,我们知道有些时候变量没有初始化可能对导致程序一些意想不到的问题,为了解决这样的问题,我可以在宣告内建型别时显示调用default构造式,像下面这样的情况
template <typename T>
void foo(){
T x = T();//如果T是内建型别,比如int,double等,x也会初始化为0
}
在class template的成员中,也可能出现这样的情况。所以一般需要使用类的参数初始化列表如下:
template <typename T>
class MyClass{
private:
T x;
public:
MyClass(): x(){
//这样也可以确保,即使T是基本类型,也能对x进行初始化
}
};
2 以字符串常量作为Function Template Argument
比如下面的代码:
#include <string>
template <typename T>
inline T const &max (T const & a,T const &b){
return a > b ? a:b;
}
int main(){
std::string s;
::max("apple","peach");
// Ok,型别相同
::max("apple","tomato");
//Error,型别不同
::max("apple",s);
//Error,型别不同
}
问题在于字符串字面常数的长度不同,因而其底层的Array型别也不同,具体的为"apple"和“peach”的型别都为char const [6],而“”tomato“的型别为char const[7],所以会有问题,当使用by value的传值形式时,可以解决一点问题,但是也会引起不必要的拷贝。具体如下:
template <typename T>
inline T max(T a ,T b){
return a > b ? a:b;
}
则上面的第一个和第二个正确,第三个仍然错误,先记住这些,具体解决办法请参考《c++ Template》
1 零值初始化
对于基本的数据类型int,double,pointer type来说,一般没有default构造式对其初始化,比如下面的代码
void foo(){
int x;
//x的值不定
int *ptr;
//ptr的指向也不定
}
如果在template中使用这样的代码,如下
template <typename T>
void foo(){
T x;
}
如果上面的的T是基本数据类型时,x的值就没有初始化,所以这样的方法是不能保证值一定被初始化的,我们知道有些时候变量没有初始化可能对导致程序一些意想不到的问题,为了解决这样的问题,我可以在宣告内建型别时显示调用default构造式,像下面这样的情况
template <typename T>
void foo(){
T x = T();//如果T是内建型别,比如int,double等,x也会初始化为0
}
在class template的成员中,也可能出现这样的情况。所以一般需要使用类的参数初始化列表如下:
template <typename T>
class MyClass{
private:
T x;
public:
MyClass(): x(){
//这样也可以确保,即使T是基本类型,也能对x进行初始化
}
};
2 以字符串常量作为Function Template Argument
比如下面的代码:
#include <string>
template <typename T>
inline T const &max (T const & a,T const &b){
return a > b ? a:b;
}
int main(){
std::string s;
::max("apple","peach");
// Ok,型别相同
::max("apple","tomato");
//Error,型别不同
::max("apple",s);
//Error,型别不同
}
问题在于字符串字面常数的长度不同,因而其底层的Array型别也不同,具体的为"apple"和“peach”的型别都为char const [6],而“”tomato“的型别为char const[7],所以会有问题,当使用by value的传值形式时,可以解决一点问题,但是也会引起不必要的拷贝。具体如下:
template <typename T>
inline T max(T a ,T b){
return a > b ? a:b;
}
则上面的第一个和第二个正确,第三个仍然错误,先记住这些,具体解决办法请参考《c++ Template》
相关文章推荐
- C++ - 函数模板(function template)右值引用参数 问题 及 解决
- 函数模版template学习中的一个编译问题
- C++ - 函数模板(function template)右值引用参数 问题 及 解决
- 关于a标签中js函数function(va1,va2)方法传递中文参数报错不执行的问题解答
- 学习心得——数组作为函数参数后sizeof获取不到数组在内存中所占字节数的问题
- C++ - 函数模板(function template) 的 推进(forward) 问题 及 解决
- 学习心得——数组作为函数参数后sizeof获取不到数组在内存中所占字节数的问题
- 《零基础入门学习Python》学习过程笔记【018函数开头文档,及参数相关问题】
- Python学习札记(十二) Function3 函数参数一
- [学习笔记]JS function的参数问题
- JS学习笔记(五):关于$(function(){});里面的函数不执行问题
- C++与C#对比学习:函数(一)C#参数传递存在的问题
- JMeter学习-027-JMeter参数文件(脚本分发)路径问题:jmeter.threads.JMeterThread: Test failed! java.lang.IllegalArgumentException: File distributed.csv must exist and be readable解决方法
- python学习之路——函数参数问题
- C语言学习6 :指针的定义,指针类型要合法,指针要初始化,指针做函数参数,数组和指针的通用性,指针+1所代表的空间,void * 指针,交换函数中的指针,数组和字符型指针区别,字符型指针的应用,使用指针完成字符操作函数
- C语言的函数重载与可变参数函数--variable argument in function
- 浅谈强化学习中的函数估计问题 - Function Approximation in RL
- SQL创建函数不成功的问题-log_bin_trust_function_creators参数研究
- 关于 Hibernate 的 SQLFunctionTemplate 的问题(HQL 不支持mysql 函数convert的问题)
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。