По умолчанию конструктор по умолчанию инициализирует переменные равными нулю?

Я обновляю класс до С++ 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;

Ответ 1

Устанавливает конструктор по умолчанию как эквивалент:

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

Нет. Это не так.


Линия

MyClass() = default;

более сродни, но не совсем эквивалентна:

 MyClass() {}

В любом случае, используя

 MyClass obj;

приводит к инициализированному по умолчанию объекту, члены которого по умолчанию инициализируются.

Однако разница между ними при использовании

 MyClass obj{};

заключается в том, что obj будет инициализироваться нулем с использованием стандартного конструктора по умолчанию, пока он по-прежнему будет инициализирован по умолчанию с предоставленным пользователем конструктором по умолчанию.

Ответ 2

Чтобы сделать все ваши переменные нулевыми инициализированными при построении, даже если создатель не запросил его, один из способов:

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

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

Затем MyClass m; будет использовать MyClassMembers{} для инициализации членов.