Oh C ++ Gurus, ich suche deine Weisheit. Sprechen Sie mit mir Standardese und sagen Sie mir, ob C ++ das folgende Programm garantiert:
#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;
}
wird immer produzieren
A::A
B::B
C::C
C::~
B::~
A::~
Mit anderen Worten, wird garantiert, dass Mitglieder in der Reihenfolge der Erklärung initialisiert und in umgekehrter Reihenfolge vernichtet werden?
Antworten:
Ja zu beiden. Siehe 12.6.2
quelle
Ja, das sind sie (nicht statische Mitglieder). Siehe 12.6.2 / 5 für die Initialisierung (Konstruktion) und 12.4 / 6 für die Zerstörung.
quelle
Ja, der Standard garantiert, dass Objekte in der umgekehrten Reihenfolge zerstört werden, in der sie erstellt wurden. Der Grund ist, dass ein Objekt ein anderes verwenden kann und daher davon abhängt. Erwägen:
Wenn
a
vor zerstören warenb
dannb
würde ein ungültiges Mitglied Referenz halten. Durch die Zerstörung der Objekte in umgekehrter Reihenfolge, in der sie erstellt wurden, garantieren wir die korrekte Zerstörung.quelle
Ja und ja. Die Reihenfolge der Zerstörung ist für Elementvariablen immer entgegengesetzt zur Reihenfolge der Konstruktion.
quelle