对于默认构造函数,知道应该这么用:classType objectName;
估计你知道不能classType objectName();因为这是函数声明而不是类对象定义,很多资料都已提及。
但是稍微变化一下,就未必一下子反应过来了,看下面这个例子:
struct IntTest
{
int ival;
};
int main(int argc, char* argv[])
{
IntTest val1; // 未初始化
IntTest val2 = IntTest();
IntTest val3( IntTest() ); // 这个是函数声明!
IntTest val4(( IntTest() )); // 这个是对象定义
// std::cout << val1.ival << std::endl; // error, 使用了未初始化的局部变量“val1”
std::cout << val2.ival << std::endl;
// std::cout << val3.ival << std::endl; // error, val3是函数名,不是类对象
std::cout << val4.ival << std::endl;
return 0;
}
看val3:本意是使用默认构造函数构造一个临时类对象再调用copy构造函数初始化,作用同val2;
但实际上同classType objectName();一样,这是函数声明。
当然,你通常不会这么用,因为你总是像val1一般这样使用,
但是在这个例子中,val1内部没有初始化
val2、val4的ival值为0;
尤其是当val2、val3两行写在一起时,很有迷惑性,
更糟糕的是单独val3这行,编译器没有任何错误提示。
解决方法是像val4这样,有点别扭的两重括号
记录在此,以防出错