Heim > Backend-Entwicklung > C++ > Hauptteil

Wie garantiert der C-Standard die Reihenfolge der Member-Konstruktor- und Destruktor-Aufrufe in einer Klasse mit Member-Variablen anderer Klassen?

Mary-Kate Olsen
Freigeben: 2024-11-08 06:31:02
Original
475 Leute haben es durchsucht

How does the C   standard guarantee the order of member constructor and destructor calls in a class with member variables of other classes?

Reihenfolge der Mitgliedskonstruktor- und Destruktoraufrufe

Problem:

In C, wenn eine Klasse Mitgliedsvariablen anderer enthält Bei Klassen ist die Reihenfolge ihrer Initialisierung und Zerstörung entscheidend. Betrachten Sie das folgende Programm:

#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;
}
Nach dem Login kopieren

Unter dem C-Standard ist garantiert, dass dieses Programm immer die folgende Ausgabe erzeugt:

A::A
B::B
C::C
C::~
B::~
A::~
Nach dem Login kopieren

Antwort:

Ja, das ist garantiert.

Gemäß Abschnitt 12.6.2 des C-Standards folgen die Initialisierung und Zerstörung von Mitgliedern innerhalb einer Klasse bestimmten Regeln:

Initialisierungsreihenfolge

  • Virtuelle Basisklassen (falls vorhanden) werden zuerst in der Tiefe zuerst von links nach rechts initialisiert.
  • Direkte Basisklassen werden als nächstes in der Deklarationsreihenfolge initialisiert .
  • Nicht statische Datenelemente werden in der Deklarationsreihenfolge initialisiert, unabhängig von der Reihenfolge der Elementinitialisierung.
  • Der Konstruktorkörper wird zuletzt ausgeführt.

Zerstörungsreihenfolge

  • Zusammengesetzte Anweisung des Destruktorkörpers wird zuerst ausgeführt.
  • Nicht statische Datenelemente werden in umgekehrter Deklarationsreihenfolge zerstört.
  • Direkte Basisklassen werden in der Deklarationsreihenfolge zerstört.
  • Virtuelle Basisklassen (falls vorhanden) werden zuletzt zerstört, in umgekehrter Tiefe zuerst und von links nach rechts.

In der In diesem Beispiel werden die Mitglieder der Aggregate-Struktur in der Reihenfolge a, b und c deklariert. Daher ist gewährleistet, dass sie in der Reihenfolge A::A, B::B und C::C initialisiert und in der umgekehrten Reihenfolge C::~, B::~ und A::~ zerstört werden.

Das obige ist der detaillierte Inhalt vonWie garantiert der C-Standard die Reihenfolge der Member-Konstruktor- und Destruktor-Aufrufe in einer Klasse mit Member-Variablen anderer Klassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage