You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:24:21