C++: порядок инициализации элементов данных класса

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

class A {};
class B {};
class X
{
 A a;
 B b;
};
36
задан Guy Avraham 24 September 2018 в 11:50
поделиться

2 ответа

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

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

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

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

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

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

62
ответ дан 27 November 2019 в 05:46
поделиться

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

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

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

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

9
ответ дан 27 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: