对于int、double或者指针等基本类型,并不存在“用一个有用的缺省值来对它们进行初始化”的缺省构造函数;相反,任何未被初始化的局部变量都有一个不确定的值
void foo(){
int x; // x具有一个不确定的值
int *ptr; // ptr指向某块内存
}
现在,假如你在编写模板,并且希望模板类型的变量都已经用缺省值初始化完毕,那么这时就会遇到问题,内建类型不能满足要求
template<typename T>
void foo(){
T x; // 如果T是内建类型,那么x本身就是一个不确定的值
}
由于这个原因,我们应该显式的调用内建类型的缺省构造函数:
template<typename T>
void foo(){
T x = T(); //如果T是内建类型,x是0或者false
}
对于类模板,在用某种类型实例化该模板后,为了确认它所有的成员都已经初始化完毕,需要定义一个缺省构造函数,通过一个初始化列表来初始化类模板的成员:
template<typename T>
class MyClass{
private:
T x;
public:
MyClass() : x(){ //确认x已经被初始化,内建类型对象也是如此
}
};