そのため、C++ での初期化の規則を理解しようと懸命に努力しています。
次のコードを書きました。
struct B {
int i;
// this prevents the definition of an implicit default constructor
B( int j ) : i(j) {}
};
struct C {
int i;
// i is not mentioned in the initializer list
// the compiler will call default constructor for i
C() {}
};
int main() {
int x( 1 );
cout << " x = " << x << endl;
// error: no matching function for call to ‘B::B()’
//B b4 = B();
//cout << " b4.i = " << b4.i << endl;
C c1;
cout << " c1.i = " << c1.i << endl;
}
1) x は正しく 1 に初期化されていますが、"int x(1)" という表記がわかりません。値で初期化されていません ("int x = int()" と書くと、x は 0 になります)。組み込み型にはコンストラクターがないため、コンストラクター呼び出しでもありません。また、次のページには、「コンストラクターを持つクラスのオブジェクトのみが関数スタイルの構文で初期化できる」と明確に記載されています。
http://msdn.microsoft.com/en-us/library/w7wd1177(v=vs.100).aspx
2) b4 の作成をコメント解除するとコンパイルされません。コンストラクターを定義したため、コンパイラーは暗黙のデフォルト コンストラクターを生成しません。これで問題ありません。しかし、これにより、「B()」を使用して一時的に値を初期化したオブジェクトを作成できないのはなぜでしょうか? "B()" と書くのは決してコンストラクター呼び出しではありませんね。
3) クラス C のコメントで説明されているように、 i は初期化子リストに記載されていません。したがって、デフォルトで初期化する必要があります。これは、int 型に対して未定義であることを意味します。しかし、プログラムを実行するたびに出力は「c1.i = 0」です。
ありがとう。