共用体 は、そのすべてのメンバーがメモリー内の同じ場所から開始する ということを除けば、構造体に類似したオブジェクトです。 共用体は、一度に、そのメンバーのうちの 1 つの値しか含むことができません。 static ストレージを持つ共用体のデフォルトの初期化指定子は最初のコンポーネントの デフォルトであり、automatic ストレージを持つ共用体には何も含まれません。
共用体に割り振られるストレージは、共用体の最も大きいメンバーで必要なストレージです (これに、最も厳格な要件を持つメンバーの自然境界で共用体が終了するのに必要な埋め込みが加わります)。 このため、可変的に変更され る型は共用体メンバーとして宣言できません。すべての共用体のコンポーネントは、メモリー内で効果的にオーバーレイされます。 つまり、共用体の各メンバーは共用体の開始時に始動するストレージが割り振られ、一度に 1 メンバーしか そのストレージを占有することができません。
最初のメンバーだけでなく共用体の任意のメンバーを、指定機能を使用して初期化できます。
共用体の指定された初期化指定子は、構造体と同じ構文を持ちます。
以下の例において、指定機能は .any_member、初期化指定子は {.any_member
= 13 } です。
union { /* ... */ } caw = { .any_member = 13 };
共用体の定義ごとに、同じソース・ファイルにある他の共用体型とは異なるか、
または互換性のない新規の構造体型を作成します。
ただし、すでに定義された共用体型への参照で
ある型指定子は同じ型です。
共用体タグが、参照と定義を関連付け、型名として効果的に機能します。
C++ では、共用体は、クラス型の限定された形式です。
それには、アクセス指定子 (public、protected、private)、メンバー・データ、メンバー関数
(コンストラクターおよびデストラクターを含む) を含めることができます。
それには、仮想メンバー関数または静的データ・メンバーを含めることはできません。
共用体のメンバーのデフォルトのアクセスは public です。
共用体は、基底クラスとして使用できず、また基底クラスから派生できません。
C++ は、共用体メンバーの許容データ型に制限を追加します。C++ の共用体メンバーは、 コンストラクター、デストラクター、または多重定義コピー代入演算子を持つクラス・オブジェクトにすることは できません。共用体メンバーは、static というキーワードでは宣言できません。
関連参照