Можно ли выбрать между инициализацией по умолчанию и инициализацией значения или всем массивом или его частью? - PullRequest
3 голосов
/ 07 февраля 2012

Начиная с C ++ 2003 у нас есть инициализация значения, а также инициализация по умолчанию. Это означает, что:

struct Foo {
    int i;
    std :: string s;
};

Foo f1;          // f1.s is default-constructed, f1.i is uninitialised
Foo f2 = Foo (); // f1.s is default-constructed, f1.i is zero

правый

Теперь предположим, что у меня есть этот класс

class Bar : public Foo {
    int n;
    Foo f [SIZE];
public:
    Bar ();
};

Когда я пишу конструктор для Bar, я могу захотеть инициализировать по умолчанию или инициализировать значение либо родительского класса, либо члена f[]. Я думаю, что выбор для инициализации родителя просто:

Bar :: Bar () : Foo (), n (-1) {} // Parent is value-initialised (Foo::i is zero)
Bar :: Bar () : n (-1)         {} // Parent is default-initialised (Foo::i is undefined)

А как насчет f[] члена?

  • Как инициализировать по умолчанию все элементы?
  • Как мне инициализировать все элементы?
  • Если я использую списки инициализаторов C ++ 11, что произойдет, если список инициализаторов будет иметь размер, отличный от SIZE?

1 Ответ

1 голос
/ 07 февраля 2012

На самом деле, в соответствии со стандартным значением инициализация кажется процессом вызова любой формы определяемого пользователем конструктора по умолчанию или нулевой инициализации объектов, у которых нет конструктора по умолчанию (см. Параграф 8.5 [decl.init]7:

Инициализация значения объекта типа T означает:

- если T является (возможно, cv-квалифицированным) типом класса (раздел 9) с предоставленным пользователемконструктор (12.1), тогда вызывается конструктор по умолчанию для T (и инициализация некорректна, если у T нет доступного конструктора по умолчанию);

- если T является (возможно, cv-квалифицированным) несоединениемТип класса без предоставленного пользователем конструктора, тогда объект инициализируется нулями и, если неявно объявленный конструктор T по умолчанию является нетривиальным, этот конструктор вызывается.

- если T является типом массива, токаждый элемент инициализируется значением, иначе объект инициализируется нулями.

В этом смысле вы можете инициализировать значение вашего массиваr начиная с C ++ 1998, используя f() в списке инициализаторов членов.Если вы хотите использовать определенные значения, вам нужно использовать C ++ 2011 со списком инициализаторов, например f({ 1, 2, 3 }).Если аргументов меньше, чем элементов, остальные элементы инициализируются значением.На самом деле они инициализируются из пустого списка инициализаторов (8.5.1 [dcl.init.aggr] параграф 7):

Если в списке меньше инициализаторов, чем членов вагрегируется, то каждый член, не инициализированный явно, должен быть инициализирован из пустого списка инициализаторов.

... и эта инициализация из пустого списка инициализаторов означает в соответствии с 8.5.4 [dcl.init.list]параграф 3, пункт 7:

  • В противном случае, если в списке инициализатора нет элементов, объект инициализируется значением.
...