値の初期化の規則による。値の初期化が発生します。
1,5) 名前のない一時オブジェクトが空の括弧または中括弧のペアで構成される初期化子で作成された場合 (C++11以上);
2,6) 動的記憶域期間を持つオブジェクトが、括弧または中括弧の空のペアで構成される初期化子を持つ new 式によって作成される場合 (C++11以上)。
3,7) 非静的データ メンバーまたは基底クラスが空の括弧または中括弧のペアを持つメンバー初期化子を使用して初期化される場合 (C++11以上)。
4) 名前付き変数 (自動、静的、またはスレッドローカル) が、中かっこのペアで構成される初期化子で宣言されている場合。
些細な例
struct A{
int i;
string s;
A(){};
};
A a{}
cout << a.i << endl // default initialized value
コンストラクターを明示的に宣言せずに、デフォルトのデフォルト ctor のままにしておきます // コンパイラーが生成したものを取得します。
struct A{
int i;
string s;
};
A a{};
cout << a.i << endl // zero-initialized value
ただし、別の構造体を使用しています。
struct A{
int i;
string s;
};
struct B{
A a;
int c;
};
B a{};
cout << a.a.i << endl // default initialized , even tho we did not , int struct B , declared A a{}.
ai の値は、ルールに反する {} / () 構造を使用しなくても、ゼロで初期化されます (私が間違っていない場合)。
構造体 B で同じロジックを使用する:
struct A{
int i;
string s;
};
struct B{
A a;
int c;
};
B b;
cout << b.c << endl; // default inicialized
私たちはルールに従って行動します。
最後の例:
struct A
{
int i;
A() { }
};
struct B { A a; };
std::cout << B().a.i << endl;
B().ai も、明示的にコンストラクターを宣言し、削除されていない間、ゼロで初期化されます。
これらの値がゼロで初期化されるのはなぜですか? ここに記載されている規則により、ゼロ初期化ではなくデフォルト初期化する必要があります。
回答ありがとうございます。