首页 > 解决方案 > 具有默认值成员的结构的默认和大括号构造函数

问题描述

我想知道在为某些成员指定默认值的情况下,为结构指定 C++ 默认构造函数是否有一些区别:

struct Astruct {
    std::vector<double> v; /* has default constructor */
    double a;
    double b = 100.; /* has default value */
    Astruct() = default; /* default constructor */
};

然后以不同的方式初始化变量:

Astruct astruct = Astruct();
Astruct astruct{}; /* is it always the same as above? */
Astruct astruct = {}; /* shouldn't it force the default 'b' to zero? */
Astruct astruct; /* shouldn't it avoid any initialization at all? */

我看到有很多关于编译器生成的构造函数的默认初始化的问题,例如:

类型名称后的括号是否与 new 不同?

C++11 中的新语法“= default”

=default 和没有参数的空构造函数之间的区别?

声明 POD 结构而不使用默认构造函数时会实例化什么?

但在所有这些问题中,声明的结构都具有没有指定默认值的 POD 类型。

现在,我已经对这些初始化程序进行了一些尝试,我看到例如在new Astruct(末尾没有括号)中,b被初始化为我提供的默认值,但a没有被初始化为零 - 我不会期望默认值值仍然存在,我想知道这是否意味着引入默认值以某种方式改变了默认初始化对结构的 POD 成员的工作方式。

尽管如此,我得到的结果每次运行都会有所不同(有时a也为零new Astruct),所以我不能 100% 确信我得到的一切都是由于按照标准保证了初始化,或者由于幸运运行内存已经被零初始化或从以前开始重用。

这四种初始化方式应该发生什么astructAstruct() = default在将构造函数声明为vs.时,这 4 行中的任何一行的作用会有什么不同Astruct() {}吗?使用这种编译器生成的构造函数,默认值是否会以某种方式在默认初始化方面有所不同?

标签: c++default-constructor

解决方案


推荐阅读