重複の可能性:
C++ 初期化リスト
クラスでのメンバーごとの初期化と直接の初期化の違いは何ですか? クラスで定義されている 2 つのコンストラクターの違いは何ですか?
class A
{
public:
int x;
int y;
A(int a, int b) : x(a), y(b)
{}
A(int a, int b)
{
x = a;
y = b;
}
};
重複の可能性:
C++ 初期化リスト
クラスでのメンバーごとの初期化と直接の初期化の違いは何ですか? クラスで定義されている 2 つのコンストラクターの違いは何ですか?
class A
{
public:
int x;
int y;
A(int a, int b) : x(a), y(b)
{}
A(int a, int b)
{
x = a;
y = b;
}
};
理論的な答えは他のメンバーによって与えられています。
実用的には、メンバーごとの初期化は次の場合に使用されます。
MyClass & mMyClass
) があります。メンバーごとの初期化を行う必要があります。そうしないと、コンパイルされません。const MyClass mMyClass
。また、メンバーごとの初期化を行う必要があります。そうしないと、コンパイルされません。MyClass mMyClass
コンストラクターなしMyClass::MyClass()
)。また、メンバーごとの初期化を行う必要があります。そうしないと、コンパイルされません。MyClass mMyClass
および)がありsizeof(MyClass) = 1000000000
ます。メンバーごとの初期化では、一度だけビルドします。コンストラクターで直接初期化すると、2 回ビルドされます。1 つ目は初期化を使用し、2 つ目は初期化を使用せず、代入を使用します。2 番目のメンバーでは、メンバーx
とy
が最初にデフォルトで初期化され (ゼロで)、次に と がa
それぞれ割り当てられb
ます。
また、2 番目のものでは、メンバーの型が重要なデフォルト コンストラクターを持っている場合にのみ、メンバーがデフォルトで初期化されることに注意してください。それ以外の場合、初期化はありません (@James がコメントで指摘したように)。
このトピックを参照してください。