2014-09-05 2 views
0

Существуют ли какие-либо опасности при инициализации родительского класса пустой конструктора в списке инициализации ребенка?Инициализировать родительский класс с пустым конструктором в списке инициализаторов?

Пример:

class Parent 
{ 
    public: 
    Parent(){} 
    ~Parent(){} 
}; 

class Child : public Parent 
{ 
    public: 
    Child(): Parent() 
    {} 
    ~Child(){} 
}; 

Причина вопроса: Я часто вижу код, в котором класс «Родитель» с пустым CTOR не инициализирован в списке инициализации ребенка CTOR.

+3

конструктор по умолчанию вызывается неявно, если вы не явно вызвать конструктор в списке инициализации. – scohe001

ответ

1

Предположим, что Parent не имеет предоставленного пользователем конструктора, например. если она представляет собой агрегат:

struct Parent 
{ 
    int x; 
    int get_value() const { return x; } 
}; 

В настоящее время есть разница (см [dcl.init]/(8,1)), так как стоимость инициализации Parent будет нулевой элемент инициализации x, тогда как по умолчанию инициализации будет нет:

struct GoodChild : Parent { GoodChild() : Parent() {} }; 

struct BadChild : Parent { BadChild() {} }; 

Поэтому:

int n = GoodChild().get_value(); // OK, n == 0 

int m = BadChild().get_value(); // Undefined behaviour 
+1

В частности, согласно C++ 11, база будет инициализироваться по умолчанию, если инициализатор не указан ('[C++ 11: 12.6.2/8]'), а инициализация по умолчанию для агрегата ничего не приносит. Напротив, в том числе 'Parent()' в _ctor-initialiser_ будет заканчиваться инициализацией значения его членов ('[C++ 11: 12.6.2/7]'). –

+1

Downvoter, пожалуйста, объясните свое возражение? Я был бы рад улучшить нечеткие или отсутствующие точки (или просто отредактировать его самостоятельно). –

+0

@ T.C .: Это имеет смысл, спасибо. Я отредактировал сообщение, чтобы это отразить. (Очистка комментариев.) –

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