13

変数を初期化する前に親クラスのコンストラクターが呼び出されるか、またはコンパイラーが最初にクラスの変数を初期化しますか?

例えば:

class parent {
  int a;
public:
  parent() : a(123) {};
};

class child : public parent {
  int b;
public:
            // question: is parent constructor done before init b?
  child() : b(456), parent() {};
}
4

5 に答える 5

18

はい、基本クラスは、派生クラスのメンバーの前、およびコンストラクタ本体が実行される前に初期化されます。

12.6.2 ベースとメンバーの初期化 [class.base.init]

非委任コンストラクターでは、初期化は次の順序で進行します。

— 最初に、最も派生したクラス (1.8) のコンストラクターの場合のみ、仮想基底クラスは、基底クラスの有向非巡回グラフの深さ優先の左から右への走査に現れる順序で初期化されます。 -to-right」は、派生クラス base-specifier-list 内の基底クラスの出現順序です。

— 次に、直接基底クラスは、base-specifier-list に表示される宣言順に初期化されます (mem-initializer の順序に関係なく)。

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

— 最後に、コンストラクター本体の複合ステートメントが実行されます。

于 2013-03-12T16:26:29.567 に答える
3

はい、親コンストラクターは常に派生クラスの前に呼び出されます。そうしないと、派生クラスは親クラスによって設定されたものを「変更」できませんでした。

于 2013-03-12T16:23:11.063 に答える
2

いくつかのアドバイスとして、よくわからない場合は、通常、次のようなことを自分でテストできます。

#include <iostream>
using namespace std;

class parent {
protected:
  int a;
public:
  parent() : a(123) { cout << "in parent(): a == " << a << endl; };
};

class child : public parent {
  int b;
public:
            // question: is parent constructor done before init b?
  child() : b(456), parent() { cout << "in child(): a == " << a << ", b == " << b << endl; };
};

int main() {
  child c;
  return 0;
}

版画

in parent(): a == 123
in child(): a == 123, b == 456
于 2013-03-12T16:27:51.483 に答える
0

派生クラスは、その基本クラスの追加の追加または拡張と考えてください。追加すると、何かに追加されます(これはすでに存在している必要があります)。次に、別の問題はメンバーの初期化です。ここでは、デフォルトのコンストラクターを提供しました

public:
  parent() : a(123) {};

したがって、この方法で親を作成した場合でも、メンバーはデフォルトで123で初期化されます。

parent p;

オブジェクトを値で初期化するデフォルトのコンストラクターがなかった場合

class parent {
public:
  int a;
};

メンバーのデフォルトの値よりも、クラスがPODの場合、intはデフォルトで0に初期化されますが、そうでない場合、つまり、文字列やベクトルなどのより多くのメンバーを提供します。

class parent {
public:
  int a;
  std::string s;
  std::vector<int> v;
};

intを初期化するデフォルトのコンストラクターがない場合、intはランダムな値になります。

于 2013-03-12T17:01:36.443 に答える
0

はい、オブジェクトの構築は親クラスから始まり、子クラスになるため、コンストラクター呼び出しはその順序です。破壊の場合、これは正反対です。

于 2013-03-12T16:47:47.510 に答える