2016-07-11 2 views
-5
#include <vector> 

// version 1 
struct A 
{ 
    std::vector<int> m_coll; 

    // The compiler will generate a ctor A() here 
}; 

// version 2 
struct A 
{ 
    std::vector<int> m_coll; 
    A(){} 
}; 

// version 3 
struct A 
{ 
    std::vector<int> m_coll; 
    A() : m_coll(){} 
}; 

// version 4 
struct A 
{ 
    std::vector<int> m_coll; 
    A() = default; 
}; 

В чем разница между четырьмя версиями?«A()» против «A() = default;» vs. Implicit A()?

Является ли m_coll гарантией инициализации по умолчанию во всех этих версиях?

+3

Посмотрите, что каждый делает и сравнивает. –

+0

@LightnessRacesinOrbit, честно говоря, легко пропустить, что '= default' и полагаться на неявное объявление работает по-разному в присутствии других конструкторов. –

+0

@ Revolver_Ocelot: легко пропустить, да; но сначала вам нужно провести некоторое исследование, чтобы иметь хоть какой-то шанс. –

ответ

3

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

struct A { 
    int i; 
    std::vector<int> coll; 
}; 

В этом случае компилятор генерирует c'tor по умолчанию для вас, но i не инициализируется, поэтому вам придется установить его в явном виде.

Давайте улучшить положение вещей:

struct B { 
    int i {}; 
    std::vector<int> coll; 
}; 

Для B, компилятор генерирует также c'tor по умолчанию для вас, но i инициализируется в классе, и поэтому по умолчанию построенный объект типа B а является полностью инициализируется. Теперь предположим, что я хочу, чтобы добавить определенный пользователем c'tor:

struct C { 
    int i {}; 
    std::vector<int> coll; 
    C(int const j) : i{j} {} 
}; 

Добавление определяемых пользователем c'tor подавляет автоматическую генерацию конструктора по умолчанию. Таким образом, чтобы включить c'tor по умолчанию, можно сделать несколько разных вещей:

struct D1 { 
    int i {}; 
    std::vector<int> coll; 
    D1(int const j) : i{j} {} 
    D1(){} 
}; 

Хотя выше хорошо образован, я считаю, это некрасиво. Здесь D1(){}- по умолчанию c'tor, а i соответственно инициализирован, так как он имеет инициализатор в классе. Тем не менее, это более описательный, чтобы сделать что-то вроде:

struct D2 { 
    int i {}; 
    std::vector<int> coll; 
    D2(int const j) : i{j} {} 
    D2() = default; 
}; 

Таким образом, вы можете прочитать , что вы включаете c'tor по умолчанию.

По моему опыту, полезно использовать default всякий раз, когда нужно включить определение по умолчанию для конструкторов копирования и перемещения и операторов присваивания и определения по умолчанию для виртуальных деструкторов.

Короче говоря: Использования default всякий раз, когда вам нужно включить c'tor или оператор присваивания, что компилятор в противном случае был бы подавить, или когда вам нужно определение по умолчанию для виртуального деструктора.

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