码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-31 10:42:52      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:构造函数 c++

对于默认构造函数,知道应该这么用: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这样,有点别扭的两重括号

记录在此,以防出错

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

标签:构造函数 c++

原文地址:http://blog.csdn.net/u013470115/article/details/43339013

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!