【问题标题】:Different ways of initializing an object with default constructor in C++在 C++ 中使用默认构造函数初始化对象的不同方法
【发布时间】:2020-10-04 08:54:28
【问题描述】:
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的优化时才会发生,对吧?

【问题讨论】:

  • 如果 4 aa.a 都被初始化了

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


【解决方案1】:

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

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

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

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

  4. 在概念上第四个是copy initializationa是从A()复制初始化的(值初始化临时A)。因为copy elision(因为C++17是强制的)a可能被直接初始化值,因为结果(不会被复制省略改变)a.a被零初始化为0a.str 由其默认构造函数初始化。

【讨论】:

  • a 的默认构造函数在聚合初始化的情况 2,3 中不会被调用
  • @M.M 我不这么认为,因为我认为 A 不是聚合,因为它有一个非聚合成员 str,这似乎是错误的......
  • “聚合”的含义由[dcl.init.aggr]定义,不禁止子对象为非聚合
  • @M.M 谢谢指点,我的误会。
  • @M.M “不调用默认构造函数”是什么意思?在这种情况下,编译器在哪里添加了默认构造函数?当我添加到类默认构造函数时,它在所有情况下都会被调用。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2023-03-14
  • 2012-01-02
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2021-05-28
相关资源
最近更新 更多