Инициализация по умолчанию в С++
Я спрашивал себя сегодня утром, и я не могу найти слова для "google" для него:
Допустим, у меня есть:
struct Foo
{
int bar;
};
struct Foo2
{
int bar;
Foo2() {}
};
struct Foo3
{
int bar;
Foo3() : bar(0) {}
};
Теперь, если я создавал по умолчанию Foo
, Foo2
и Foo3
:
Foo foo;
Foo2 foo2;
Foo3 foo3;
В этом случае (s) является членом bar
правильно инициализированным?
(Хорошо Foo3
явно явно инициализирует его и здесь показано только для явной разницы с Foo2
, поэтому вопрос в основном касается первых двух.)
Спасибо!:)
Ответы
Ответ 1
Только foo3 будет во всех контекстах. foo2 и foo будут, если они имеют статическую продолжительность. Обратите внимание, что объекты типа Foo могут быть инициализированы нолем в других контекстах:
Foo* foo = new Foo(); // will initialize bar to 0
Foo* foox = new Foo; // will not initialize bar to 0
в то время как Foo2 не будет:
Foo2* foo = new Foo2(); // will not initialize bar to 0
Foo2* foox = new Foo2; // will not initialize bar to 0
эта область сложна, формулировка, измененная между С++ 98 и С++ 03 и, IIRC, снова с С++ 0X, поэтому я не буду зависеть от нее.
С
struct Foo4
{
int bar;
Foo4() : bar() {}
};
Строка всегда будет инициализирована.
Ответ 2
Так как bar
является встроенным типом, его инициализация по умолчанию будет undefined для Foo1
и Foo2
. Если бы это был особый тип, тогда был бы вызван конструктор по умолчанию, но здесь это не так.
Урок: всегда инициализируйте переменные.
Ответ 3
Для типов pod инициализация по умолчанию - инициализация нуля.
Таким образом:
Foo() : b() {}
совпадает с Foo() : b(0) {}
Я не могу найти соответствующую часть стандарта С++, но если вы полностью пропустите инициализатор, то типы POD не должны инициализироваться по умолчанию (в отличие от не-POD-типов, которые есть).
Поэтому в вашем случае правильно инициализируется только третий пример.
Ответ 4
Случай 3 является правильным способом, с списком инициализации члена.
Ни один из первых двух не будет правильно инициализирован, так как вы не дадите им начальное значение (точно так же, как только переменная, определенная не инициализирована).