ホームページ >バックエンド開発 >C++ >C 集合体のメンバー オブジェクトの初期化と破棄の順序はどのように決定されるのでしょうか?

C 集合体のメンバー オブジェクトの初期化と破棄の順序はどのように決定されるのでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-07 18:17:02673ブラウズ

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

C におけるメンバーの初期化と破棄の順序

C では、メンバー オブジェクトが初期化および破棄される順序は、動作を理解するために重要です。複雑なデータ構造の。次のプログラムについて考えてみましょう:

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

このプログラムは、他の 3 つの構造体 A、B、C を含む集約構造体のインスタンスを作成します。このプログラムを実行すると、次の出力が生成されます。 🎜>

A::A
B::B
C::C
C::~
B::~
A::~
この出力は疑問を引き起こします: この構築と破壊の順序は C 標準によって保証されていますか?

答えは

はいです。 C 標準 (12.6.2) によれば、集合構造体のメンバーは次の順序で初期化および破棄されます:

  • 初期化順序:

      最初に、仮想基本クラスが派生クラス宣言に現れる順序で初期化されます。
    • 次に、直接基本クラスが基本クラス リストに現れる順序で初期化されます。
    • 最後に、非静的データ メンバーはクラス定義で宣言された順序で初期化されます。
  • 破棄順序:

      非静的データ メンバーは、初期化された逆の順序で破棄されます。
    • 直接基本クラスは、初期化された逆の順序で破棄されます。
    • 仮想基本クラスは、
したがって、指定されたプログラムでは、メンバーの構築と破棄の順序は次のように保証されます:

    初期化: A::A、B::B、C::C
  1. 破壊: C::~、B::~、A::~
これC で複雑なデータ構造を作成および破棄するときの一貫した動作を保証します。

以上がC 集合体のメンバー オブジェクトの初期化と破棄の順序はどのように決定されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。