请教默认构造函数调用自定义构造函数的问题

先看一段简单的代码吧:
#include
usingnamespacestd;
structCLS
{
intm_i;
CLS(inti):m_i(i){}
CLS()
{
CLS(2);
}
};
intmain(intargc,char*argv[])
{
CLSobj1;
cout<
CLS*obj2=newCLS();
cout<m_i<deleteobj2;
return0;
}
上面代码的输出结果是:
-1220312074
0
显然,我预期的输出结果是2,但不管是在栈上构造对象还是在堆上构造对象,结果都不是我们想要的。
这是什么原因呢?
CLSobj1;为什么不能写成CLSobj1();
为什么自动分配的对象和new的对象会输出不同的结果?
交互式爱情
浏览 387回答 2
2回答

慕少森

1、你在构造函数中调用了另一个构造函数,实际上只是创建了一个匿名的临时变量!而不是像你想象中的那样!2、如果写成CLSobj1();那就是一个函数声明!3、你在构造函数中没有显式对成员变量进行初始化或者赋值,所以m_i的结果是未定义的!

炎炎设计

1.这才是符合你预期的写法,至于你的写法为什么是错的,原因是因为你写错了,详见各种入门书籍。CLS():CLS(2){}2.因为有歧义,至于具体为什么不能这么写,因为这是规定。leunggamciu回复jollywing:因为有歧义!这样就没问题:CLSobj1=CLS();3.这是未定义行为,不同的编译器有不同的结果。至于为什么是未定义行为,个人猜测是为了保证可移植性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript