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

О, гуру C++, я ищу вашу мудрость. Говорите стандартизируют мне и говорят мой, если C++ гарантирует что следующая программа:

#include <iostream>
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::~

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

113
задан sbk 12 February 2010 в 18:44
поделиться

4 ответа

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

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

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

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

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

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

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

130
ответ дан 24 November 2019 в 02:43
поделиться

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

29
ответ дан 24 November 2019 в 02:43
поделиться

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

struct A { };

struct B {
 A &a;
 B(A& a) : a(a) { }
};

int main() {
    A a;
    B b(a);
}

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

9
ответ дан 24 November 2019 в 02:43
поделиться

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

6
ответ дан 24 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

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