Порядок вызовов конструктора элементов и деструктора

О, C ++ гуру, я ищу твою мудрость. Поговорите со стандартным мне и сообщите моему, если C ++ гарантирует, что следующая программа:

#include  using namespace std; struct A { A() { cout << "A::A" << endl; } ~A() { cout << "A::~" << endl; } }; struct B { B() { cout << "B::B" << endl; } ~B() { cout << "B::~" << endl; } }; struct C { C() { cout << "C::C" << endl; } ~C() { cout << "C::~" << endl; } }; struct Aggregate { A a; B b; C c; }; int main() { Aggregate a; return 0; } 

всегда будет производить

 A::A B::B C::C C::~ B::~ A::~ 

Другими словами, члены гарантируются, что они будут инициализированы по порядку декларации и уничтожены в обратном порядке?

Другими словами, члены гарантируются, что они будут инициализированы по порядку декларации и уничтожены в обратном порядке?

Да для обоих. См. 12.6.2

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

  • Во-первых, и только для конструктора самого производного classа, как описано ниже, виртуальные базовые classы должны быть инициализированы в том порядке, в котором они появляются на первом пересечении слева направо, направленном ациклическим графом базовых classов, где «left -to-right “- это порядок появления имен базового classа в базе-спецификаторе производного classа.

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

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

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

Да, они (нестатические члены, которые есть). См. 12.6.2 / 5 для инициализации (строительства) и 12.4 / 6 для уничтожения.

Да, стандартные гарантии объектов разрушаются в обратном порядке, они были созданы. Причина в том, что один объект может использовать другой, поэтому зависит от него. Рассматривать:

 struct A { }; struct B { A &a; B(A& a) : a(a) { } }; int main() { A a; B b(a); } 

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

Да и да. Порядок разрушения всегда противоположный порядку построения для переменных-членов.

  • Лучший способ рандомизировать массив с .NET.
  • C # Как перевести виртуальный keycode на char?
  • Is "for (;;)" быстрее чем "while (TRUE)"? Если нет, то почему люди используют его?
  • Является ли использование динамической считается плохой практикой?
  • Когда следует использовать std :: size_t?
  • Глобально конвертировать UTC DateTimes в пользовательские локальные DateTimes
  • IOException: процесс не может получить доступ к файлу «путь к файлу», поскольку он используется другим процессом
  • Почему fork () дважды
  • getline работает неправильно? Каковы могут быть причины?
  • Что такое тильда (~) в определении enums?
  • Как получить каталог из полного пути файла?
  • Interesting Posts

    Как отключить регистрацию INFO в Spark?

    USB-накопитель на 16 ГБ отображает 16 МБ и неприменим

    Удалить значение Null из массива String в java

    Чистая установка Windows 8 на OEM-ноутбуке Windows 8

    Android: Как GridView auto_fit находит количество столбцов?

    Как я могу быть уверенным, что плагины браузера защищены?

    Могу ли я контролировать расположение пользовательских настроек .NET, чтобы избежать потери настроек при обновлении приложений?

    Получать использование данных по каждому соединению

    String valueOf против конкатенации с пустой строкой

    Как динамически удалять элементы из списка ListView при нажатии кнопки?

    Пример шаблона knockoutjs для приложений с несколькими видами просмотра

    Thunderbird не удаляет сообщения с POP-сервера

    Не удается обновить графические драйверы – OEM или общий – драйвер не поддерживает эту версию Windows. – Toshiba – Intel HD 4600

    Как получить доступ к параметрам задания из ItemReader, в Spring Batch?

    Мышь / Холст X, Y – Three.js World X, Y, Z

    Давайте будем гением компьютера.