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

标签 c++ initialization c++17 default-constructor

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. 第一个是default initialization ,因为结果 a.a 被初始化为不确定值(或者如果 a 是静态或线程本地对象,则零初始化为 0), a.str 由其默认构造函数初始化。

  2. 第二个是direct-list-initializationaggregate initialization执行,结果 a.avalue-initialized ( zero-initialized ) 到 0a.str 由其默认构造函数初始化。

  3. 第三个是copy-list-initialization并执行聚合初始化,结果a.a被值初始化(零初始化)为0a.str由其初始化默认构造函数。

  4. 概念上,第四个是 copy initialization , a 是从 A() 复制初始化的(值初始化的临时 A)。因为copy elision (从 C++17 起,这是强制性的)a 可能会直接进行值初始化,因为结果(不会通过复制省略而更改)a.a 是零初始化的到 0 时,a.str 由其默认构造函数初始化。

关于c++ - 在 C++ 中使用默认构造函数初始化对象的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62379855/

相关文章:

c++ - std::list 按索引删除元素

c++ - 在声明 c++ 之后给出的维度

C - 矩阵重新分配和未初始化的值

c++ - 我可以使表达式constexpr吗?

c++ - C++17 会允许嵌套类的前向声明吗?

c++ - 为什么 std::get for variant 会引发失败而不是未定义的行为?

c++ - Boost多边形库 bool 函数计算时间

C++ 判断一个容器是否有::find()

c++ - boost::circular_buffer 如何处理覆盖移位

C结构体使用前要初始化吗?