Порядок вызовов конструктора элементов и деструктора
О, 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::~
Другими словами, члены гарантируются, что они будут инициализированы по порядку декларации и уничтожены в обратном порядке?
- Получение всех имен controllerов и действий в C #
- Как использовать функцию rand для создания чисел в определенном диапазоне?
- Почему C # реализует методы как не виртуальные по умолчанию?
- C ++ вызывает явный конструктор шаблонов
- std :: transform () и toupper (), нет соответствующей функции
- Почему lambda C ++ 11 требует по умолчанию «изменяемого» ключевого слова для захвата по значению?
- Как выполнить команды процесса (или аналогичные) с помощью приложения Universal Windows Platform (UWP)?
- Как я могу повысить производительность с новым предварительным просмотром Visual Studio 2013?
- Excel interop: рабочий стол или рабочий лист?
- Лучший способ чтения большого файла в массив байтов в C #?
- Как написать короткий литерал на C ++?
- Использование SO_REUSEADDR?
- Использование IsAssignableFrom с открытыми типами
Другими словами, члены гарантируются, что они будут инициализированы по порядку декларации и уничтожены в обратном порядке?
Да для обоих. См. 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
будет содержать недопустимую ссылку на элемент. Уничтожив объекты в обратном порядке, в которых они были созданы, мы гарантируем правильное уничтожение.
Да и да. Порядок разрушения всегда противоположный порядку построения для переменных-членов.