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

С++: порядок инициализации членов класса данных

В следующем коде, когда вызывается ctor из X, сначала будет вызываться ctor A или B? Означает ли порядок, в котором они помещены в тело класса? Если кто-то может предоставить фрагмент текста из стандарта С++, который говорит об этой проблеме, это было бы прекрасно.

class A {};
class B {};
class X
{
 A a;
 B b;
};
4b9b3361

Ответ 1

Порядок - это порядок, который они отображаются в определении класса - это из раздела 12.6.2 стандарта С++:

5 Инициализация должна выполняться в в следующем порядке:

- Во-первых, и только для конструктор самого производного класс, как описано ниже, виртуальная база классы должны быть инициализированы в порядок они появляются на глубине слева направо направленный ациклический граф основания классы, где "слева направо" является порядок появления базового класса имена в производном классе базовый спецификатор-лист.

- Тогда, прямо базовые классы должны быть инициализированы в порядок декларации, как они появляются в список-спецификатор базы (независимо от порядок mem-инициализаторов).

- Тогда нестатические члены данных должны быть инициализированы в том порядке, в котором они были объявлено в определении класса (опять же, независимо от порядка MEM-инициализаторы).

- Наконец, тело конструктора. [Заметка: приказ о предложении поручается обеспечить, чтобы базовые и членные подобъекты уничтожаются в обратном порядке инициализация. ]

Ответ 2

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

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

Уничтожение членов класса всегда происходит в обратном порядке построения.

Порядок инициализации баз и членов определяется в 12.6.2 [class.base.init]/5.