コンストラクタ呼び出し順序

1607 ワード

コンストラクション関数の呼び出し順序:
  class B1
  {
  public:
	B1(int i){cout<

コンストラクション関数の実行順序は、次のようによく知られています.
 
ベースクラス構築関数を呼び出し、呼び出し順序は継承時に宣言された順序に従います.組み込みメンバーオブジェクトのコンストラクション関数を呼び出し、クラスで宣言された順序で呼び出します.派生クラスのコンストラクション関数体の内容.構造関数の呼び出し順序が逆です.
では、以上の例を見ると分かりやすいです.B 2,B 1,B 3はCのベースクラスであるが,上記の手順ではまずベースクラスを構築し,次にサブオブジェクトを構築し,最後にそれ自体のコンストラクション関数であるため,この3つのクラスのコンストラクション関数を先に実行する.構築時にクラス内の順序に従って,まずB 2の構築関数を呼び出す.
B 2(int j){cout<デフォルトパラメータリストで
  C(int a, int b, int c, intd):B1(a),memberB2(d),memberB1(c),B2(b){}
で、bの値がB 2のコンストラクタに渡され、bは2であるため、以下のように印刷される.
  constructing B2 2
次に作るのがB 1です.明らかにCのデフォルトパラメータ構築リストでaの値がB 1に渡され、
印刷:
  constructing B1 1
B 3は構築時にパラメータを渡さず、B 3(){cout<を呼び出して印刷する.
cout<このときベースクラスのコンストラクション関数が実行され、次にメンバーオブジェクトを埋め込んだコンストラクション関数が処理されます.
Cクラスには3つのオブジェクトがある:B 1 memberB 1;B2 memberB2;B3memberB3;,コンストラクション関数の呼び出し順序に従って、クラスで宣言された順序に従ってmemberB 1、memberB 2、memberB 3をそれぞれ構築する必要があります.デフォルトのパラメータリストでは、cでmemberB 1を、dでmemberB 2を、
印刷:
  constructing B1 3
  constructing B2 4
  constructing B3 *
最後に自身のコンストラクション関数を呼び出すと,関数体が空であるため,何も印刷されなかった.
 
要約:クラスがベースクラスと継承され、それ自体に他のクラスのメンバーオブジェクトが含まれている場合、コンストラクション関数の呼び出し順序は、ベースクラスのコンストラクション関数を呼び出す->メンバーオブジェクトを呼び出すコンストラクション関数を呼び出す->独自のコンストラクション関数を呼び出すことであることを明確にする必要があります.コンストラクション関数の呼び出し順序は、コンストラクション関数の初期化リストの式の順序によってまったく影響されず、ベースクラスの宣言回数とメンバーオブジェクトの関数での宣言順序に関係します.
次のようになります.
#include
class A
{
protected:
    char c;
public:
    A(char ch)
    {
          c=ch;
           cout<