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
或不确定的值。详细信息,
第一个是default initialization ,因为结果
a.a
被初始化为不确定值(或者如果a
是静态或线程本地对象,则零初始化为0
),a.str
由其默认构造函数初始化。第二个是direct-list-initialization和 aggregate initialization执行,结果
a.a
为 value-initialized ( zero-initialized ) 到0
,a.str
由其默认构造函数初始化。第三个是copy-list-initialization并执行聚合初始化,结果
a.a
被值初始化(零初始化)为0
,a.str
由其初始化默认构造函数。概念上,第四个是 copy initialization ,
a
是从A()
复制初始化的(值初始化的临时A
)。因为copy elision (从 C++17 起,这是强制性的)a
可能会直接进行值初始化,因为结果(不会通过复制省略而更改)a.a
是零初始化的到0
时,a.str
由其默认构造函数初始化。
关于c++ - 在 C++ 中使用默认构造函数初始化对象的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62379855/