gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:48:43 29 4
gpt4 key购买 nike

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

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com