質問

C++ での構築順序と初期化順序の保証については、いくつか疑問があります。たとえば、次のコードには 4 つのクラスがあります。 X, Y, Z そして W. 。main 関数はオブジェクトをインスタンス化します。 class X, のオブジェクトが含まれています。 class Y, 、から派生します class Z, したがって、両方のコンストラクターが呼び出されます。さらに、 const char* に渡されるパラメータ Xのコンストラクターは暗黙的に のオブジェクトに変換されます。 class W, 、 それで Wのコンストラクターも呼び出す必要があります。

C++ 標準では、コピー コンストラクターの呼び出し順序に関してどのような保証が与えられていますか?あるいは、同様に、このプログラムで何を印刷できるのでしょうか?

#include <iostream>

class Z {
   public:
   Z() { std::cout << "Z" << std::endl; }
};

class Y {
   public:
   Y() { std::cout << "Y" << std::endl; }
};

class W {
   public:
   W(const char*) { std::cout << "W" << std::endl; }
};

class X : public Z {
   public:
   X(const W&) { std::cout << "X" << std::endl; }
   private:
   Y y;
};

int main(int, char*[]) {
   X x("x");
   return 0;
}

編集:これは正しいです?

   W      |
 /   \    |
Z     Y   |
 \   /    |
   X      V
役に立ちましたか?

解決

は、すべてのクラスでは、建設順序が保証されてベースクラスを、正しい順序でメンバ変数に続いて左から指定されたクラス定義で宣言されました。その拠点とメンバーの構造の全てが完了したら、クラスのコンストラクタ本体が実行されます。

あなたの例のX

Z由来しYベースオブジェクトは、まずZ部材Yyのコンストラクタ本体の実行にXの完了の次に構造を構築しているようXが含まれる。

一時的Wは、それがXの建設が始まる前に構築され、xの完了の初期化後に破棄されますので、xのコンストラクタに渡すために必要とされます。

だから、プログラムが印刷する必要があります:

W
Z
Y
X

他のヒント

すべての

1)まず、引数を計算するために必要とされます。

2)をこのベースクラスが構成されている。

その後メンバーは、クラスの宣言に出現順に構成されている

3)。

4)次に、Xのコンストラクタが呼び出された

  1. W オブジェクトは、X へのコンストラクターが呼び出される前に構築されます。
  2. Z は X の基本クラスとして、X のメンバーより前に初期化されます。
  3. Y はメンバーの初期化中に初期化されます
  4. X のコンストラクターが実行されます。
、チャールズ・ベイリーの答えにあなたのベースクラスを仮想的に継承されたルールの変更を展開するには、

。私は常に順序が何であるかを忘れて、IBMのサイトは仮想塩基が最初に初期化されますが、私はちょうどそれがトリビアよりも実際にはもっとだ場合に実行したことがありませんと言います。

ルールを要約すると次のようになります。

  1. 引数 (右から左へ)
    a.一番右
    b.右から2番目
  2. 基本クラス
  3. バーチャルベース
  4. 基本クラスを左から右へ
  5. クラス内の宣言順のメンバー
  6. 呼び出されるクラスのコンストラクター
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top