2

クラスA、B、Cがあるとします

次のようなコンテナがある場合

Container::Container()
:A(10),B(20),C(30)
{
   //Do something specific
}

ここで、Container のデストラクタ、つまり ~Container() を呼び出すと、デストラクタが逆の順序、つまり ~C()、~B()、そして ~A() で呼び出されていることがわかります。

これは常に決まった順序ですか?構築初期化セットのデストラクタの順序について、誰かがもう少し光を当てることができますか?

4

3 に答える 3

7

順序は固定されていますが、初期化リストによるものではありません。

これは、メンバーがクラスで宣言される逆の順序です。

class Container
{
   A a;
   B b;
   C c;
};

オブジェクトが破棄されるときContainer、メンバーが破棄される順序はcbおよびaです。

一部のコンパイラでは、宣言された順序とは異なる順序でメンバーを初期化すると警告が表示されますが、一貫性を維持することをお勧めします。

于 2012-08-02T06:48:38.497 に答える
6

それらは常に構築の逆順で破壊されます。構築の順序は、初期化子リストの順序に関係なく、常に宣言の順序です。

于 2012-08-02T06:48:55.157 に答える
3

メンバー (および非仮想サブオブジェクト) は、宣言された順序で構築され、逆の順序で破棄されます。イニシャライザ リスト内のイニシャライザの順序は関係ありませんが、同じにすることを強くお勧めします。

これがあったと想像してください: Foo(int n) : a(n), b(a) { }. これは良さそうに見えますが、Foo::b実際に の前に宣言されていた場合Foo::a、これは未定義の動作になる可能性があります (bのコンストラクターが完全な型を必要とする場合)。これを防ぐには、関連するコンパイラの警告を常に有効にして尊重する必要があります。

于 2012-08-02T06:50:10.447 に答える