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
相关产品推荐
相关产品推荐

