在C++中使用默认构造函数初始化对象的不同方法

Different ways of initializing an object with default constructor in C++

本文关键字:对象 方法 初始化 构造函数 C++ 默认      更新时间:2023-10-16
struct A 
{
int a;
std::string str;
};
A a;// 1
A a{};// 2
A a = {};// 3
A a = A();// 4

似乎有所有选择。在 1 和 4 的情况下,a将未初始化,在 2 和 3 中,a将以零初始化,它们都是相同的,只是风格问题还是有一些区别?4 应该首先创建一个临时对象,然后将其分配给a,但只有当我完全关闭 comliler 的优化时才会发生这种情况,对吧?

对于所有情况,数据成员str始终由默认构造函数std::string进行默认初始化。由于初始化样式不同,数据成员a可能会初始化为0值或不确定值。在细节上,

  1. 第一个是默认初始化,因为结果a.a初始化为不确定值(或者如果a是静态或线程本地对象,则初始化为零0(,a.str由其默认构造函数初始化。

  2. 第二个是直接列表初始化,执行聚合初始化,因为结果a.a被值初始化(零初始化(为0a.str由其默认构造函数初始化。

  3. 第三个是复制列表初始化,执行聚合初始化,因为结果a.a被值初始化(零初始化(为0a.str由其默认构造函数初始化。

  4. 在概念上,第四个是副本初始化,a是从A()进行复制初始化的(值初始化临时A(。由于复制 elision(自 C++17 以来它是强制性的(,a可能直接进行值初始化,因为结果(不会通过复制 elision 更改(a.a被零初始化为0a.str由其默认构造函数初始化。