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

时间:2017-02-05 05:50:42

标签: c++ constructor c++14

我正在将类更新为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;

2 个答案:

答案 0 :(得分:15)

  

将构造函数设置为默认等效于:

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

没有。事实并非如此。

该行

MyClass() = default;

更接近但不完全等同于:

 MyClass() {}

在任何一种情况下,使用

 MyClass obj;

会生成一个默认初始化对象,其成员默认初始化。

但是,使用

时它们之间存在差异
 MyClass obj{};

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

答案 1 :(得分:3)

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

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

struct MyClass : MyClassMembers
{
    MyClass(): MyClassMembers{} {}
};

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