共用体の宣言
共用体:インデックス への移動
共用体の一般的な宣言構文は、構造体の場合と似ています。異なるのは以下の点です。
- 共用体にはビット フィールドを含めることができますが、アクティブになれるのは 1 つだけです。それらはすべて共用体の先頭から始まります。なお、ビット フィールドはマシンに依存するので、移植性の高いコードを作成する際に問題になるおそれがあります。
- C++ の構造体とは異なり、C++ の共用体型ではクラス アクセス指定子(public、private、protected)を使用できません。共用体のフィールドはすべて public です。
- 共用体は、次のように、最初に宣言されたメンバによってのみ初期化することができます。
union local87 { int i; double d; } a = { 20 };
共用体はクラス階層に加わることはできません。どのようなクラスからも派生できず、基底クラスになることもできません。共用体はコンストラクタを持つことができます。
無制限共用体
C++11 からは、上記の制限事項が一部解除されました。
共用体には、自明でないコンストラクタを持つオブジェクトを含めることができるようになりました。共用体にそのようなオブジェクトが含まれている場合は、共用体の暗黙のデフォルト コンストラクタが削除されるため、ユーザーが手動でコンストラクタを定義しなければなりません。以下に例を示します。
#include <new> // Required for placement 'new'.
struct 3DPoint {
3DPoint() {}
3DPoint(int x, int y, int z): x_(x), y_(y), z_(z) {}
int x_, y_, z_;
};
union U {
double w;
3DPoint p; // Allowed in C++11.
U() {new(&p) 3DPoint();} // Due to the 3DPoint member, a user-defined constructor is now required.
};
関連項目
- 配置 new(英語)
- C++11 の無制限共用体(英語)