>백엔드 개발 >C++ >C 집계에서 멤버 개체의 초기화 및 소멸 순서는 어떻게 결정됩니까?

C 집계에서 멤버 개체의 초기화 및 소멸 순서는 어떻게 결정됩니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-07 18:17:02675검색

How is the initialization and destruction order of member objects in C   aggregates determined?

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, B, C를 포함하는 집계 구조체의 인스턴스를 생성합니다. 이 프로그램을 실행하면 다음 출력이 생성됩니다.

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

이 출력은 다음과 같은 질문을 제기합니다. 이 생성 및 소멸 순서가 C 표준에 의해 보장됩니까?

답은 입니다. C 표준(12.6.2)에 따르면 집계 구조체의 멤버는 다음 순서로 초기화되고 소멸됩니다.

  • 초기화 순서:

    • 먼저 가상 기본 클래스는 파생 클래스 선언에 나타나는 순서대로 초기화됩니다.
    • 그런 다음 직접 기본 클래스는 기본 클래스 목록에 나타나는 순서대로 초기화됩니다.
    • 마지막으로 비정적 데이터 멤버는 클래스 정의에 선언된 순서대로 초기화됩니다.
  • 파기 순서:

    • 비정적 데이터 멤버는 초기화된 역순으로 소멸됩니다.
    • 직접 기본 클래스는 초기화된 역순으로 소멸됩니다.
    • 가상 기본 클래스는 초기화된 순서와 반대 순서로 소멸됩니다.

따라서 해당 프로그램에 대해 멤버 생성 및 소멸 순서는 다음과 같습니다.

  1. 초기화: A::A, B::B, C::C
  2. 파기: C::~, B::~, A::~

이것은 C에서 복잡한 데이터 구조를 생성하고 삭제할 때 일관된 동작을 보장합니다.

위 내용은 C 집계에서 멤버 개체의 초기화 및 소멸 순서는 어떻게 결정됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.