Вы касаетесь одного из липких углов C ++.
Инициализация значений POD в объектах является липкой и зависит от нескольких вещей.
Даже я не уверен, что смогу понять все правила правильно, но я верю, что @Steve Jessop однажды написал статью о SO (хотя я могу ее найти).
Но некоторые примеры:
Этот класс всегда будет инициализирован b == false и значением = 0.
class A
{
A() : b(), value() {}
B b;
int value;
};
Без явного конструктора по умолчанию это более сложно:
Здесь компилятор сгенерирует конструктор по умолчанию для вас. Но то, как сгенерированный компилятором конструктор по умолчанию работает, зависит от ситуации. Сгенерированный компилятором конструктор по умолчанию может выполнять две разные формы инициализации и зависит от контекста:
- Инициализация нуля (все члены POD обнуляются)
- Инициализация значения (все члены POD остаются неопределенными)
Пример: * * тысяча двадцать-восемь
class B
{
B b;
int value;
};
// Variables of static storage duration (notably globals)
// Will be zero initialized and thus b == false and value = 0
B global; // Initialized
int main()
{
// Object of automatic storage duration or dynamic storage duration
// These will depend on how they are declared.
// Value Initialization (POD re-mains undefined)
B bo1; // b/value undefined
B* bp1 = new B; // b.balue undefined
// Zero Initialization
B bo2 = B(); // b = false, value = 0
B* bp2 = new B(); // b = false, value = 0
// Note: The most obvious syntax for zero initializing a local object
// does not work as it is actually interpreted as a forward
// declaration of a function;
B bo3();
}