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

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

记录在此,以防出错

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值