46

次のコードでは、ctorXが呼び出されたときに、ctorAまたはctor がB最初に呼び出されますか? それらがクラスの本体に配置される順序はこれを制御しますか? この問題について説明する C++ 標準のテキストのスニペットを誰かが提供できれば、それは完璧です。

class A {};
class B {};
class X
{
 A a;
 B b;
};
4

2 に答える 2

76

順序は、クラス定義に表示される順序です。これは、C++ 標準のセクション 12.6.2 からのものです。

5 初期化は次の順序で進行する。

— 最初に、以下で説明する最も派生したクラスのコンストラクターに対してのみ、仮想基底クラスは、基底クラスの有向非巡回グラフの深さ優先の左から右へのトラバーサルに現れる順序で初期化されます。 left-to-right」は、派生クラス base-specifier-list 内の基本クラス名の出現順序です。

— 次に、直接基底クラスは、base-specifier-list に表示される宣言順に初期化されます (mem-initializer の順序に関係なく)。

— 次に、非静的データ メンバーは、クラス定義で宣言された順序で初期化されます (これも mem-initializer の順序に関係なく)。

— 最後に、コンストラクターの本体が実行されます。[注: 宣言の順序は、基本サブオブジェクトとメンバー サブオブジェクトが初期化の逆の順序で確実に破棄されるようにするために義務付けられています。]

于 2010-04-19T18:41:12.080 に答える
14

初期化は常に、クラスメンバーがクラス定義に表示される順序で行われるため、例aではb.

各メンバーの初期化の間にはシーケンス ポイントがあり、まだ初期化されていないメンバーへの参照をクラス メンバーのコンストラクターに渡すことができますポインターを形成するためのアドレス)、他の使用法は未定義の動作を引き起こす可能性があります。

クラス メンバーの破棄は、常に構築と逆の順序で行われます。

ベースとメンバーの初期化の順序は、12.6.2 [class.base.init]/5 で定義されています。

于 2010-04-19T18:37:19.433 に答える