3

非常によく似た質問を見てきましたが、答えを理解しているかどうかはよくわかりません。コンストラクターをデリゲートすると、初期化リストからどの初期化が発生しますか?

例:

MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL),
int1(a),
int2(b),
pOtherClass(NULL)
{
}

MyClass::MyClass(int a, int b, Other *p)
:
int1(a),
int2(b),
pOtherClass(p)
{
     if (pOtherClass == NULL)
     {
         pOtherClass = &DefaultInstance;
     }
}

ここでは、コンパイラの設定により、両方のクラスの完全な初期化子リストが必要です。しかし、私が望んでいないのは次のとおりです。

  1. 最初のコンストラクター ( ) が 2 番目のコンストラクター ( )int, intを呼び出すint, int, Other *
  2. 2 番目のコンストラクターは、デフォルトのアドレスをpOtherClass
  3. 最初のコンストラクターの初期化リストが に割り当てpOtherClassられNULLます。

一番上にリンクした質問は、この動作が発生しないことを示しているようですint, intが、( ) コンストラクターの初期化子リストのポイントは何ですか? コンパイラを満足させるためだけですか?

4

1 に答える 1

5

C++ 標準によると

mem-initializer-id がコンストラクターのクラスを指定する場合、それが唯一の mem-initializer になります。コンストラクターは委任コンストラクターであり、mem-initializer によって選択されたコンストラクターはターゲット コンストラクターです。プリンシパル コンストラクターは、オブジェクトの構築で呼び出される最初のコンストラクターです (つまり、そのオブジェクトの構築のターゲット コンストラクターではありません)。ターゲット コンストラクターは、オーバーロードの解決によって選択されます。ターゲット コンストラクターが戻ると、委譲コンストラクターの本体が実行されます。コンストラクターがそれ自体に直接的または間接的に委譲する場合、プログラムの形式は正しくありません。診断は必要ありません。

したがって、このコンストラクタ定義

MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL),
int1(a),
int2(b),
pOtherClass(NULL)
{
}

無効です。

でなければなりません

MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL)
{
}
于 2014-02-19T16:42:27.927 に答える