ホームページ  >  記事  >  バックエンド開発  >  C 標準では、他のクラスのメンバー変数を含むクラス内でのメンバーのコンストラクターとデストラクターの呼び出しの順序はどのように保証されますか?

C 標準では、他のクラスのメンバー変数を含むクラス内でのメンバーのコンストラクターとデストラクターの呼び出しの順序はどのように保証されますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-08 06:31:02447ブラウズ

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

メンバーのコンストラクターとデストラクターの呼び出しの順序

問題:

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

C 標準では、このプログラムが常に次の出力を生成することが保証されていますか:

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

答え:

はい、そうです

C 標準のセクション 12.6.2 に従って、クラス内のメンバーの初期化と破棄は特定のルールに従います。

初期化順序

  • 仮想基本クラス (存在する場合) は深さ優先で最初に初期化されます。左から右。
  • 次に直接基本クラスが宣言順に初期化されます。
  • 非静的データ メンバーは、メンバーの初期化の順序に関係なく、宣言順に初期化されます。
  • コンストラクター本体は最後に実行されます。

破壊順序

  • デストラクター本体の複合ステートメントが最初に実行されます。
  • 非静的データ メンバーは、宣言順序で破棄されます。
  • 直接の基本クラスは宣言順に破棄されます。
  • 仮想基本クラス (存在する場合) は最後に破棄されます。 reverse Depth-First, left-to-right order.

この例では、Aggregate 構造体のメンバーは a、b、c の順序で宣言されています。したがって、A::A、B::B、C::C の順序で初期化され、その逆の C::~、B::~、A::~ の順序で破棄されることが保証されます。

以上がC 標準では、他のクラスのメンバー変数を含むクラス内でのメンバーのコンストラクターとデストラクターの呼び出しの順序はどのように保証されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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