C ++: порядок инициализации членов класса данных - PullRequest
35 голосов
/ 19 апреля 2010

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

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

Ответы [ 2 ]

59 голосов
/ 19 апреля 2010

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

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

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

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

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

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

9 голосов
/ 19 апреля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...