最初に、値で初期化された のインスタンスからコピーして初期 化します。C++03 標準、§8.5/7 から:a
MyClass
初期化子が括弧の空のセット、つまり () であるオブジェクトは、値で初期化されます。
そして§8.5/5から:
タイプのオブジェクトを値で初期化T
するとは、次のことを意味します。
- ユーザーが宣言したコンストラクターを持つクラス型の場合
T
、デフォルトのコンストラクターT
が呼び出されます (アクセス可能なデフォルトのコンストラクターがない場合、初期化は整形式でT
はありません)。
- ユーザーが宣言したコンストラクターを持たない非共用体クラス型の場合
T
、すべての非静的データ メンバーと基本クラス コンポーネントT
は値で初期化されます。
- が配列型の場合
T
、各要素は値で初期化されます。
- それ以外の場合、オブジェクトはゼロで初期化されます
タイプのオブジェクトをゼロで初期化T
するとは、次のことを意味します。
- がスカラー型の場合
T
、オブジェクトは0
(ゼロ) に変換された値に設定されT
ます。
T
非共用体クラス型の場合、各非静的データ メンバーと各基本クラス サブオブジェクトはゼロで初期化されます。
T
が共用体型の場合、オブジェクトの最初の名前付きデータ メンバー) はゼロで初期化されます。
- が配列型の場合
T
、各要素はゼロで初期化されます。
T
が参照型の場合、初期化は実行されません。
2 番目の例では、POD タイプでない場合にデフォルトで初期化b
されるような方法で宣言します-- §8.5/5:MyClass
タイプ T のオブジェクトをデフォルトで初期化するとは、次のことを意味します。
- が
T
非 POD クラス タイプの場合、デフォルト コンストラクタT
が呼び出されます(アクセス可能なデフォルト コンストラクタがない場合、初期化は不適切な形式T
です)。
- が配列型の場合
T
、各要素はデフォルトで初期化されます。
- それ以外の場合、オブジェクトはゼロで初期化されます。
ただし、MyClass
POD タイプであるため、b
初期化されていません -- §8.5/9:
オブジェクトに初期化子が指定されておらず、オブジェクトが (おそらく cv 修飾された) 非 POD クラス型 (またはその配列) である場合、オブジェクトはデフォルトで初期化されます。オブジェクトが const 修飾された型の場合、基になるクラス型には、ユーザーが宣言した既定のコンストラクターが必要です。それ以外の場合、非静的オブジェクトに対して初期化子が指定されていない場合、オブジェクトとそのサブオブジェクト (存在する場合) の初期値は不確定です。オブジェクトまたはそのサブオブジェクトのいずれかが const 修飾された型である場合、プログラムは不正な形式です。