次のコードでは、ctorX
が呼び出されたときに、ctorA
またはctor がB
最初に呼び出されますか? それらがクラスの本体に配置される順序はこれを制御しますか? この問題について説明する C++ 標準のテキストのスニペットを誰かが提供できれば、それは完璧です。
class A {};
class B {};
class X
{
A a;
B b;
};
次のコードでは、ctorX
が呼び出されたときに、ctorA
またはctor がB
最初に呼び出されますか? それらがクラスの本体に配置される順序はこれを制御しますか? この問題について説明する C++ 標準のテキストのスニペットを誰かが提供できれば、それは完璧です。
class A {};
class B {};
class X
{
A a;
B b;
};
順序は、クラス定義に表示される順序です。これは、C++ 標準のセクション 12.6.2 からのものです。
5 初期化は次の順序で進行する。
— 最初に、以下で説明する最も派生したクラスのコンストラクターに対してのみ、仮想基底クラスは、基底クラスの有向非巡回グラフの深さ優先の左から右へのトラバーサルに現れる順序で初期化されます。 left-to-right」は、派生クラス base-specifier-list 内の基本クラス名の出現順序です。
— 次に、直接基底クラスは、base-specifier-list に表示される宣言順に初期化されます (mem-initializer の順序に関係なく)。
— 次に、非静的データ メンバーは、クラス定義で宣言された順序で初期化されます (これも mem-initializer の順序に関係なく)。
— 最後に、コンストラクターの本体が実行されます。[注: 宣言の順序は、基本サブオブジェクトとメンバー サブオブジェクトが初期化の逆の順序で確実に破棄されるようにするために義務付けられています。]
初期化は常に、クラスメンバーがクラス定義に表示される順序で行われるため、例a
ではb
.
各メンバーの初期化の間にはシーケンス ポイントがあり、まだ初期化されていないメンバーへの参照をクラス メンバーのコンストラクターに渡すことができます。ポインターを形成するためのアドレス)、他の使用法は未定義の動作を引き起こす可能性があります。
クラス メンバーの破棄は、常に構築と逆の順序で行われます。
ベースとメンバーの初期化の順序は、12.6.2 [class.base.init]/5 で定義されています。