Programming

멤버 생성자 및 소멸자 호출 순서

procodes 2020. 7. 27. 08:09
반응형

멤버 생성자 및 소멸자 호출 순서


오 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::~

즉, 선언 순서에 따라 멤버가 초기화되고 역순으로 소멸되도록 보장됩니까?


즉, 선언 순서에 따라 멤버가 초기화되고 역순으로 소멸되도록 보장됩니까?

둘 다 그렇습니다. 12.6.2 참조

6 초기화는 다음 순서로 진행됩니다.

  • 먼저, 아래에 설명 된 가장 파생 된 클래스의 생성자에 대해서만 가상 기본 클래스는 기본 클래스의 지시 된 비순환 그래프의 깊이 우선 왼쪽에서 오른쪽 순회에 나타나는 순서대로 초기화됩니다. -to-right”는 파생 클래스 base-specifier-list에서 기본 클래스 이름이 나타나는 순서입니다.

  • 그런 다음 직접 기본 클래스는 mem-initializer의 순서에 관계없이 기본 지정자 목록에 표시되는대로 선언 순서대로 초기화됩니다.

  • 그런 다음 비 정적 데이터 멤버는 클래스 정의에서 선언 된 순서대로 초기화됩니다 (다시 mem-initializer의 순서에 관계없이).

  • 마지막으로 생성자 본문의 복합 문이 실행됩니다. [참고 : 선언 순서는 기본 및 멤버 하위 오브젝트가 초기화의 역순으로 파괴되도록 보장해야합니다. — 끝 노트]


그렇습니다 (정적이 아닌 구성원). 초기화 (구축)는 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);
}

If a were to destruct before b then b would hold an invalid member reference. By destructing the objects in the reverse order in which they were created we guarantee correct destruction.


Yes and yes. The order of destruction is always opposite to the order of construction, for member variables.

참고URL : https://stackoverflow.com/questions/2254263/order-of-member-constructor-and-destructor-calls

반응형