Подтвердить что ты не робот

Инициализация по умолчанию в С++

Я спрашивал себя сегодня утром, и я не могу найти слова для "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, поэтому вопрос в основном касается первых двух.)

Спасибо!:)

4b9b3361

Ответ 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 является правильным способом, с списком инициализации члена.

Ни один из первых двух не будет правильно инициализирован, так как вы не дадите им начальное значение (точно так же, как только переменная, определенная не инициализирована).