Home >Backend Development >C++ >How is the initialization and destruction order of member objects in C aggregates determined?

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

Linda Hamilton
Linda HamiltonOriginal
2024-11-07 18:17:02675browse

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

Member Initialization and Destruction Order in C

In C , the order in which member objects are initialized and destructed is crucial for understanding the behavior of complex data structures. Let's consider the following program:

#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;
}

This program creates an instance of an aggregate struct that contains three other structs, A, B, and C. When we execute this program, the following output is produced:

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

This output raises the question: is this order of construction and destruction guaranteed by the C standard?

The answer is yes. According to the C standard (12.6.2), members of an aggregate struct are initialized and destructed in the following order:

  • Initialization Order:

    • First, virtual base classes are initialized in the order they appear in the derived class declaration.
    • Then, direct base classes are initialized in the order they appear in the base class list.
    • Finally, non-static data members are initialized in the order they are declared in the class definition.
  • Destruction Order:

    • Non-static data members are destructed in the reverse order they were initialized.
    • Direct base classes are destructed in the reverse order they were initialized.
    • Virtual base classes are destructed in the opposite order they were initialized.

Therefore, for the given program, the order of member construction and destruction is guaranteed to be:

  1. Initialization: A::A, B::B, C::C
  2. Destruction: C::~, B::~, A::~

This guarantees consistent behavior when creating and destroying complex data structures in C .

The above is the detailed content of How is the initialization and destruction order of member objects in C aggregates determined?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn