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

C++11及以后版本中对象初始化的零值输出疑问

C++11及之后版本中代码输出是否必须为零的分析

针对你给出的代码,三种对象创建方式的输出规则在C++11及之后版本中存在差异,具体分析如下:

1. std::make_shared<Demo>() 创建的对象

std::make_shared会对分配的对象执行值初始化。这意味着Demo的成员line、Line的成员start/end,以及Point的x/y都会被值初始化。对于int类型,值初始化的结果固定为0,因此这部分的输出必须是0。

2. Demo demo; 默认初始化

Demo的构造函数是=default,属于编译器生成的默认构造函数。当使用Demo demo;这种默认初始化方式时,类的成员会执行默认初始化。对于int类型的成员,默认初始化不会赋予确定值,其值属于未定义的垃圾值,因此这部分的输出不保证是0。

3. Demo demo1{}; 列表初始化

使用空列表{}进行初始化属于值初始化,规则和std::make_shared一致。所有成员都会被值初始化,int类型的x/y会被置为0,因此这部分的输出必须是0。

总结:只有std::make_shared创建的对象和Demo demo1{};创建的对象能保证输出0,Demo demo;的输出是未定义的。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:17:04