template学习之零值初始化及字符串常量作(function template argument)函数模版参数问题
来源:互联网 发布:北京纸箱厂 淘宝彩色 编辑:程序博客网 时间:2024/05/22 09:38
本篇只是摘抄自《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》
- template学习之零值初始化及字符串常量作(function template argument)函数模版参数问题
- function template函数模版
- C++ - 函数模板(function template)右值引用参数 问题 及 解决
- 函数模版template学习中的一个编译问题
- 函数模板(Function Template)
- function template函数模板概念笔记----C++学习之路
- C++template--函数模版
- PHPCMS模版解析之TEMPLATE函数
- c++ template模版学习
- c++学习篇之模版template
- 模版模式(Template)
- C++ - 函数模板(function template)返回值
- c++函数模板(function template)
- 一:函数模板(Function Template)
- C++ - 可变参数函数模板(Variadic Function Template) 详解 及 代码
- Class template basic_ptree(模版类里再混有模版函数)
- 模版template
- 设计模式之Template(模版)
- Mutex和内存可见性
- 黑马程序员 Java自学总结四 函数
- poj 3635 带花费的Dij+head优化
- Moravec角点检测
- 黑马程序员 Java自学总结五 数组
- template学习之零值初始化及字符串常量作(function template argument)函数模版参数问题
- hdu1281(最小覆盖点+匈牙利算法)
- Javascript单元测试框架比较Qunit VS Jasmine
- UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测
- [JVM-翻译]揭开java.lang.OutOfMemoryError面纱之一
- Delphi中打开工程文件提示“……Socket not found.”
- UNIX环境高级编程——非阻塞设置 && I/O多路转接
- Java学习之道:java设计模式—Decorator模式
- 黑马程序员 Java自学总结六 面向对象三个特征之封装