質問1:デフォルトのコンストラクターは、C++標準に従ってPODメンバーを0に初期化します。以下の引用テキストを参照してください。
質問2:コンストラクターを基本クラスで指定する必要がある場合、そのクラスを共用体の一部にすることはできません。
最後に、ユニオンのコンストラクターを提供できます。
union U
{
A a;
B b;
U() { memset( this, 0, sizeof( U ) ); }
};
Q1の場合:
C ++ 03から、12.1コンストラクター、190ページ
暗黙的に定義されたデフォルトコンストラクターは、空のmem-initializer-list(12.6.2)と空の関数本体を使用して、そのクラスのユーザー作成のデフォルトコンストラクターによって実行されるクラスの初期化のセットを実行します。
C ++ 03から、8.5イニシャライザー、145ページ
デフォルトで-タイプTのオブジェクトを初期化するということは、次のことを意味します。
- Tが非PODクラスタイプ(9節)の場合、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります)。
- Tが配列型の場合、各要素はデフォルトで初期化されます。
- それ以外の場合、オブジェクトはゼロで初期化されます。
タイプTのオブジェクトをゼロ初期化するということは、次のことを意味します。
- Tがスカラー型(3.9)の場合、オブジェクトはTに変換された0(ゼロ)の値に設定されます。
- Tが非ユニオンクラスタイプの場合、各非静的データメンバーと各基本クラスサブオブジェクトはゼロで初期化されます。
- Tが共用体型の場合、オブジェクトの最初の名前付きデータメンバーはゼロで初期化されます。
- Tが配列型の場合、各要素はゼロで初期化されます。
- Tが参照型の場合、初期化は実行されません。
第2四半期の場合:
C ++ 03から、12.1コンストラクター、190ページ
コンストラクターは、暗黙的に宣言されたデフォルトコンストラクターであり、次の場合は簡単です。
- そのクラスには仮想関数(10.3)と仮想基本クラス(10.1)がなく、
- そのクラスのすべての直接基本クラスには、簡単なコンストラクターがあり、
- クラスタイプ(またはその配列)であるそのクラスのすべての非静的データメンバーの場合、そのような各クラスには簡単なコンストラクターがあります
C ++ 03から、9.5ユニオン、162ページ
ユニオンはメンバー関数(コンストラクタとデストラクタを含む)を持つことができますが、仮想(10.3)関数を持つことはできません。組合は基本クラスを持たないものとする。ユニオンは基本クラスとして使用してはなりません。自明でないコンストラクター(12.1)、自明でないコピーコンストラクター(12.8)、自明でないデストラクタ(12.4)、または自明でないクラスのオブジェクトコピー代入演算子(13.5.3、12.8)は、ユニオンのメンバーになることも、そのようなオブジェクトの配列になることもできません。