2017-02-05 14 views
12

Я обновляю класс до 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, и я получаю нули так или иначе, но я не уверен, что это удача или нет)

Я Instancing класс без скобок: MyClass obj;

+2

Человек, я собирался дать вам верный ответ, но теперь я не уверен. См. Также http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types – Mikhail

+0

Hahah :) Я знаю, правильно! Я действительно видел этот пост, но это был действительно этот комментарий, который оставил меня неуверенным: http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types#comment36188015_2418195. Итак, он равен нулю, если у вас нет конструктора вообще, и вызовите 'MyClass instance()' с помощью скобок? : | –

+0

Логически, для установки конструктора в значение 'default' будут использоваться члены-инициализации по умолчанию. Инициализация по умолчанию не всегда эквивалентна нулевой инициализации. – Peter

ответ

11

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

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

нет, это не так.


Линия

MyClass() = default; 

больше похожа на, но не точно эквивалентны:

MyClass() {} 

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

MyClass obj; 

результаты в default- инициализированный объект, чьи члены дефа ult инициализирован.

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

MyClass obj{}; 

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

+0

typo: int {} должен быть var {} –

+0

Исправлено, спасибо! Я тоже ценю ваш ответ. Правильно ли я полагаю, что «MyClass() {}» является предоставленным пользователем конструктором, тогда как «MyClass = default;» является конструктором по умолчанию, поэтому в некоторых случаях он будет инициализирован нулевым значением? Http: // StackOverflow.com/questions/26699720/value-initialization-default-initialization-or-zero-initialization –

+0

@ChrisNolet «конструктор по умолчанию» означает конструктор, который может быть вызван без аргументов –

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{} для инициализации членов.

+0

, если только один из членов не имеет стандартного конструктора по умолчанию, как указано в ответе R Sahu. – Danra

+0

@ Danra Я предполагаю, что OP в порядке с членом, используя свой собственный конструктор, как определено –

 Смежные вопросы

  • Нет связанных вопросов^_^