Oh gourous du C ++, je cherche ta sagesse. Parlez-moi normand et dites à mon si C ++ garantit que le programme suivant:
#include 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; }
produira toujours
A::A B::B C::C C::~ B::~ A::~
En d’autres termes, est-il garanti que les membres sont initialisés par ordre de déclaration et détruits dans l’ordre inverse?
En d’autres termes, est-il garanti que les membres sont initialisés par ordre de déclaration et détruits dans l’ordre inverse?
Oui aux deux Voir 12.6.2
6 L’ initialisation doit se dérouler dans l’ordre suivant:
Premièrement, et seulement pour le constructeur de la classe la plus dérivée, comme décrit ci-dessous, les classes de base virtuelles doivent être initialisées dans l’ordre où elles apparaissent sur une première traversée gauche-droite du graphe acyclique dirigé des classes de base, -to-right ”est l’ordre d’apparition des noms de classes de base dans la liste des spécificateurs de base des classes dérivées.
Ensuite, les classes de base directes doivent être initialisées dans l’ordre de déclaration telles qu’elles apparaissent dans la liste des spécificateurs de base (quel que soit l’ordre des initialiseurs de mémoire).
Ensuite, les membres de données non statiques doivent être initialisés dans l’ordre dans lequel ils ont été déclarés dans la définition de classe (là encore, quel que soit l’ordre des initialisateurs de mémoire).
Enfin, l’instruction composée du corps du constructeur est exécutée. [Remarque: l’ordre de déclaration est obligatoire pour garantir que les sous-objects base et membre sont détruits dans l’ordre inverse de l’initialisation. —End note]
Oui, ce sont des membres non statiques. Voir 12.6.2 / 5 pour l’initialisation (construction) et 12.4 / 6 pour la destruction.
Oui, la norme garantit que les objects sont détruits dans l’ordre inverse de leur création. La raison est qu’un object peut en utiliser un autre, donc en dépendre. Considérer:
struct A { }; struct B { A &a; B(A& a) : a(a) { } }; int main() { A a; B b(a); }
Si a
devait se détruire avant b
alors b
aurait une référence de membre invalide. En détruisant les objects dans l’ordre inverse de leur création, nous garantissons une destruction correcte.
Oui et oui. L’ordre de destruction est toujours opposé à l’ordre de construction, pour les variables membres.