279

いくつかの引数を取るコンストラクターがあります。リストされた順序で構築されていると想定していましたが、あるケースでは、逆に構築されて中断されたようです。引数を逆にすると、プログラムは中止を停止しました。これは私が使用している構文の例です。問題は、この場合、a_ を b_ の前に初期化する必要があるということです。工事の順番は保証できますか?

例えば

class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};
4

3 に答える 3

311

クラス内のメンバ変数宣言の順番に依存します。あなたの例a_では最初のものになり、次にb_2番目のものになります。

于 2009-08-07T04:04:02.840 に答える
213

明確にするために、標準を引用するには:

12.6.2.5

初期化は次の順序で進行します。

...

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

...

于 2009-08-07T04:09:02.250 に答える
26

これに対する標準的なリファレンスは、12.6.2 セクション 13.3 のようです。

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

于 2016-08-17T06:59:31.690 に答える