По умолчанию конструктор по умолчанию инициализирует переменные равными нулю?
Я обновляю класс до С++ 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{}
для инициализации членов.