Неявно определенный (компилятором) конструктор по умолчанию класса не инициализирует члены встроенных типов.
Однако вы должны иметь в виду, что в некоторых случаях инициализация экземпляра класса может выполняться другими способами. Ни по умолчанию, ни по конструктору.
Например, широко распространено неправильное мнение, что для класса C
синтаксис C()
всегда вызывает конструктор по умолчанию. В действительности, однако, синтаксис C()
выполняет так называемую инициализацию значения экземпляра класса. Он будет вызывать конструктор по умолчанию, только если он объявлен пользователем . (Это в C ++ 03. В C ++ 98 - только если класс не POD). Если в классе нет объявленного пользователем конструктора, C()
не будет вызывать конструктор по умолчанию, предоставляемый компилятором, а будет выполнять специальный тип инициализации, который вообще не включает конструктор C
. Вместо этого он будет непосредственно инициализировать значение каждого члена класса. Для встроенных типов это приводит к нулевой инициализации.
Например, если в вашем классе нет объявленного пользователем конструктора
class C {
int x;
};
тогда компилятор неявно предоставит его. Предоставленный компилятором конструктор ничего не будет делать, то есть он не будет инициализироваться C::x
C c; // Compiler-provided default constructor is used
// Here `c.x` contains garbage
Тем не менее, следующие инициализации будут инициализировать нулями x
, поскольку они используют явный ()
инициализатор
C c = C(); // Does not use default constructor for `C()` part
// Uses value-initialization feature instead
assert(c.x == 0);
C *pc = new C(); // Does not use default constructor for `C()` part
// Uses value-initialization feature instead
assert(pc->x == 0);
Поведение инициализатора ()
в некоторых отношениях отличается от C ++ 98 и C ++ 03, но не в этом случае. Для приведенного выше класса C
это будет то же самое: ()
инициализатор выполняет нулевую инициализацию C::x
.
Другим примером инициализации, которая выполняется без использования конструктора, является, конечно, агрегатная инициализация
C c = {}; // Does not use any `C` constructors at all. Same as C c{}; in C++11.
assert(c.x == 0);
C d{}; // C++11 style aggregate initialization.
assert(d.x == 0);