Инициализация по умолчанию в C ++ - PullRequest
20 голосов
/ 06 июня 2011

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

В каких случаях bar элемент правильно инициализирован ?

(Ну, Foo3, очевидно, явно инициализировать его и здесь показано только для явного различия с Foo2, поэтому вопрос в основном о первых двух.)

Спасибо!:)

Ответы [ 4 ]

26 голосов
/ 06 июня 2011

Только 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

эта область хитрая, формулировка изменена между C ++ 98 и C ++ 03 и IIRC, опять же с C ++ 0X, так что я бы не зависел от этого.

С

struct Foo4
{
   int bar;
   Foo4() : bar() {}
};

бар всегда будет также инициализирован.

9 голосов
/ 06 июня 2011

Поскольку bar является встроенным типом, его инициализация по умолчанию будет неопределенной для Foo1 и Foo2.Если бы это был пользовательский тип, то был бы вызван конструктор по умолчанию, но здесь это не так.

Урок: всегда инициализируйте переменные.

2 голосов
/ 06 июня 2011

Для типов pod, инициализация по умолчанию - инициализация нуля.

Следовательно:

Foo() : b() {} совпадает с Foo() : b(0) {}

Я не могунайдите соответствующую часть стандарта C ++, но если вы полностью пропустите инициализатор, то типы POD не должны инициализироваться по умолчанию (в отличие от типов, отличных от POD).

Поэтому в вашем случае толькотретий пример правильно инициализирован.

1 голос
/ 06 июня 2011

Случай 3 - правильный путь со списком инициализации члена.

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

...