默认默认构造函数是否将变量初始化为零

Does the defaulted default constructor initialize variables to zero?

本文关键字:默认 初始化 构造函数 是否 变量      更新时间:2023-10-16

我正在将一个类更新为C++14,并试图找出在构造时将所有实例变量初始化为零的最简单方法。到目前为止,我拥有的是:

class MyClass {
public:
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
MyClass() = default;
~MyClass() = default;
}

将构造函数设置为default是否等效于执行:

MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}

还是需要初始化每个变量?(我在Visual Studio中尝试过这两种方法,无论哪种方法我都会得到零,但我不确定这是否是运气。)

我正在实例化没有括号的类:MyClass obj;

正在将构造函数设置为默认值,相当于执行:

MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}

编号。事实并非如此。


线

MyClass() = default;

更类似于但不完全等同于:

MyClass() {}

在任何一种情况下,使用

MyClass obj;

生成一个默认初始化的对象,该对象的成员是默认初始化的。

然而,当使用时,它们之间的差异

MyClass obj{};

obj将使用默认默认构造函数进行零初始化,而它仍将使用用户提供的默认构造函数进行默认初始化。

要使所有变量在构造时初始化为零,即使创建者没有请求,一种方法是:

struct MyClassMembers
{
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
};
struct MyClass : MyClassMembers
{
MyClass(): MyClassMembers{} {}
};

然后MyClass m;将使用MyClassMembers{}来初始化成员。

有几点值得澄清。对于成员如下的类,

class MyClass {
public:
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
...
}

用户定义的默认构造函数如下,

MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}

将导致成员变量的值初始化。如果成员变量是类类型,则其值初始化在特定条件下发生,如该链接中所述。

在定义带或不带大括号的对象(MyClass obj{};MyClass obj;)时,此默认构造函数将导致类成员的值初始化。

假设MyClass具有以下形式之一的默认构造函数:

MyClass() {};
MyClass() = default;

(关于默认构造函数的这两种形式的更多信息,请参阅此处。)就定义和初始化MyClass的对象而言,MyClass() {};导致默认初始化,而MyClass() = default;在定义带大括号的对象(MyClass obj{};)时导致值初始化。这是因为MyClass() {};是一个用户定义的默认构造函数,其初始化列表和正文为空,这将导致成员的默认初始化。另一方面,MyClass() = default;导致编译器定义的默认构造函数,这将在定义带大括号的对象时正确地导致值初始化。请参阅此处,了解= default;是如何出错的。