首页 > 代码库 > 一种容易出错的构造函数调用

一种容易出错的构造函数调用

对于默认构造函数,知道应该这么用:classType  objectName;

估计你知道不能classType  objectName();因为这是函数声明而不是类对象定义,很多资料都已提及。

但是稍微变化一下,就未必一下子反应过来了,看下面这个例子:

struct IntTest
{
	int ival;
};

int _tmain(int argc, _TCHAR* argv[])
{
	IntTest val1; // 未初始化
	IntTest val2 = IntTest();
	<span style="color:#FF0000;">IntTest val3(IntTest());</span>    // 这个是函数声明!
	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这样,有点别扭的两重括号

记录在此,以防出错

一种容易出错的构造函数调用