Maison > développement back-end > C++ > Comment le standard C garantit-il l'ordre des appels de constructeur et de destructeur de membres dans une classe avec des variables membres d'autres classes ?

Comment le standard C garantit-il l'ordre des appels de constructeur et de destructeur de membres dans une classe avec des variables membres d'autres classes ?

Mary-Kate Olsen
Libérer: 2024-11-08 06:31:02
original
541 Les gens l'ont consulté

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

Ordre des appels aux constructeurs et aux destructeurs de membres

Problème :

En C, lorsqu'une classe contient des variables membres d'autres classes, l’ordre de leur initialisation et de leur destruction est crucial. Considérons le programme suivant :

#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;
}
Copier après la connexion

Sous la norme C, est-il garanti que ce programme produira toujours le résultat suivant :

A::A
B::B
C::C
C::~
B::~
A::~
Copier après la connexion

Réponse :

Oui, c'est garanti.

Selon rubrique 12.6.2 du standard C, l'initialisation et la destruction des membres au sein d'une classe suivent des règles spécifiques :

Ordre d'initialisation

  • Les classes de base virtuelles (le cas échéant) sont initialisées en premier, en profondeur- d'abord, de gauche à droite.
  • Les classes de base directes sont ensuite initialisées, dans l'ordre de déclaration.
  • Non statique Les membres de données sont initialisés dans l'ordre de déclaration, quel que soit l'ordre d'initialisation des membres.
  • Le corps du constructeur est exécuté en dernier.

Ordre de destruction

  • Composé -l'instruction du corps du destructeur est exécutée en premier.
  • Les données membres non statiques sont détruites dans inverseordre de déclaration.
  • Les classes de base directes sont détruites dans l'ordre de déclaration.
  • Les classes de base virtuelles (le cas échéant) sont détruites en dernier, en profondeur inversée d'abord, à gauche- vers la droite.

Dans l'exemple fourni, les membres de la structure Aggregate sont déclarés dans l'ordre a, b et c. Par conséquent, il est garanti qu'ils seront initialisés dans l'ordre A::A, B::B et C::C et détruits dans l'ordre inverse C::~, B::~ et A::~.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal