Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-08 06:31:02476parcourir

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

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::~

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:
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