私の場合、このようなものはCppでどのように初期化されmain
ますTesting test
か?
class Testing
{
public:
Testing();
void initalize();
~Testing();
void run();
private:
int x;
int y;
int z;
bool isBugged;
OtherClass otherClass_;
};
順番は?
私の場合、このようなものはCppでどのように初期化されmain
ますTesting test
か?
class Testing
{
public:
Testing();
void initalize();
~Testing();
void run();
private:
int x;
int y;
int z;
bool isBugged;
OtherClass otherClass_;
};
順番は?
クラス コンストラクターが最初に呼び出され、初期化子リストを使用してメンバー コンストラクター呼び出しをパラメーター化できます。それ以外の場合は、クラス コンストラクター エントリの時点で既定のコンストラクターが使用されます。
Class() : otherClass_("fred", 42) {
//ctor body
}
の ctor 本体の前にOtherClass
の ( OtherClass(char *name, int age)
、たとえば) コンストラクターを呼び出します。Class
それ以外の場合は、デフォルトのコンストラクター (パラメーターなし) が使用されます。ただし、メンバーは本体で使用できるため、本体に入る前に構成されます。上記の例はイニシャライザ リストであり、Class
のコンストラクタがメンバー コンストラクタを明示的に呼び出す機会を提供します。そうでなければ、その時点でデフォルトのコンストラクタ呼び出しに解決されます。
メンバー構築の順序は、クラス宣言に (宣言の) 出現する順序です。これが初期化子リストでコンストラクターを呼び出しているように見える順序と異なる場合、コンパイラーは警告する必要があります。
最初に、基本クラスのサブオブジェクトが宣言された順序で初期化されます (ただし、クラスにはこれらのいずれもありません)。
次に、メンバーが宣言された順序で初期化されます。それらがコンストラクタのイニシャライザ リストにある場合は、そこで指定されたとおりに初期化されます。それ以外の場合は、デフォルトで初期化されます。あなたのメンバーint
とbool
メンバー、および一般的な POD タイプの場合、これは、初期化子リストにない限り、初期化されていない (または、オブジェクトに静的ストレージ期間がある場合はゼロ初期化されている) ことを意味します。
最後に、コンストラクタ本体が実行されます。それが正常に返された場合、オブジェクトは完全に構築されています。
コンストラクターのコードは示していませんが、それが些細なことであると仮定すると、内部で構築されるのTesting()
はOtherClass
.
他のメンバー変数は、自動ストレージの場合test
は初期化されず、静的ストレージの場合は静的に初期化されます。つまり、が自動ストレージの場合、そのメンバーなど。関数変数として宣言されている場合と同様に、値は不定になります。test
x