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
Libérer: 2024-11-07 18:17:02
original
707 Les gens l'ont consulté

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

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::~
Copier après la connexion

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!

source:php.cn
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