首页 > 代码库 > 一种容易出错的构造函数调用
一种容易出错的构造函数调用
对于默认构造函数,知道应该这么用: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这样,有点别扭的两重括号
记录在此,以防出错
一种容易出错的构造函数调用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。