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

问题描述 投票:1回答:1
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的优化功能时,它才会发生,对吗?

c++ initialization c++17 default-constructor
1个回答
3
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.