Maison >développement back-end >C++ >Comment l'ordre d'initialisation et de destruction des objets membres dans les agrégats C est-il déterminé ?

Comment l'ordre d'initialisation et de destruction des objets membres dans les agrégats C est-il déterminé ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-07 18:17:02675parcourir

How is the initialization and destruction order of member objects in C   aggregates determined?

Ordre d'initialisation et de destruction des membres en C

En C, l'ordre dans lequel les objets membres sont initialisés et détruits est crucial pour comprendre le comportement de structures de données complexes. 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;
}

Ce programme crée une instance d'une structure agrégée qui contient trois autres structures, A, B et C. Lorsque nous exécutons ce programme, le résultat suivant est produit :

A::A
B::B
C::C
C::~
B::~
A::~

Cette sortie soulève la question : cet ordre de construction et de destruction est-il garanti par le standard C ?

La réponse est oui. Selon la norme C (12.6.2), les membres d'une structure agrégée sont initialisés et détruits dans l'ordre suivant :

  • Ordre d'initialisation :

    • Tout d'abord, les classes de base virtuelles sont initialisées dans l'ordre dans lequel elles apparaissent dans la déclaration de classe dérivée.
    • Ensuite, les classes de base directes sont initialisées dans l'ordre dans lequel elles apparaissent dans la liste des classes de base.
    • Enfin, les données membres non statiques sont initialisées dans l'ordre dans lequel elles sont déclarées dans la définition de la classe.
  • Ordre de destruction :

    • Les données membres non statiques sont détruites dans l'ordre inverse de leur initialisation.
    • Les classes de base directes sont détruites dans l'ordre inverse de leur initialisation.
    • Les classes de base virtuelles sont détruits dans l'ordre inverse de leur initialisation.

Par conséquent, pour le programme donné, l'ordre de construction et de destruction des membres est garanti comme étant :

  1. Initialisation : A::A, B::B, C::C
  2. Destruction : C::~, B::~, A::~

Ceci garantit un comportement cohérent lors de la création et de la destruction de structures de données complexes en C .

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