C++构造器疑问:程序输出为何是1 2而非1 0 2 0?默认构造未调用原因
问题解答
问题1:为什么输出是1 2而非预期的1 0 2 0?
逐行拆解main函数的执行逻辑就能明白原因:
Number n1();:这行代码不是创建Number对象,而是声明了一个名为n1的函数(返回值为Number类型,无参数),因此不会触发默认构造函数,自然不会输出0。Number *n2 = new Number(i++);:i初始值为1,i++是后置递增运算符,会先把当前的i值(1)传入带参构造函数,输出1,之后i才会变成2。这里成功创建了动态对象,调用了带参构造函数。Number *n3;:这只是声明一个Number类型的指针,没有分配内存或创建对象,所以不会触发任何构造函数。new Number(i++);:此时i的值是2,同样通过后置递增传入当前值2,调用带参构造函数输出2,之后i变为3。这里创建的是临时动态对象,虽然会被自动销毁,但构造函数已经执行完毕,输出已经产生。
综上,程序最终输出1 2。
问题2:为什么无值初始化Number对象时默认构造函数未被调用?
你写的Number n1();属于C++里的最令人头疼的解析(Most Vexing Parse)场景:编译器会优先将这种语法解析为函数声明,而不是对象定义。
如果要调用默认构造函数创建对象,正确的写法有两种:
- 省略括号:
Number n1; - 使用C++11及以后的列表初始化:
Number n1{};
这两种写法都会触发默认构造函数,输出0。
内容的提问来源于stack exchange,提问作者user19811991
相关产品推荐
相关产品推荐

