Cpp クラス 構造体 共有体

提供:yonewiki

C++に戻る


本来の表記は「C++ クラス 構造体 共有体」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。

※このページではC++にのみ存在する機能として、記事タイトルがC++ クラス 構造体 共有体になっています。

クラス 構造体 共有体

 共用体(union)は、C++において、同じメモリ領域を複数の異なる型で共有できる特殊なデータ構造です。共用体は、メンバーのいずれか一つだけが同時に有効であることを示します。以下に、共用体の基本的な仕組みや利用の仕方を説明します。


共用体の基本構文:

union MyUnion {
    int intValue;
    float floatValue;
    char charValue;
};


 上記の例では、MyUnion という名前の共用体が定義されています。この共用体は、int、float、char の3つのメンバーを持っており、同時にこれらの型のうちの一つだけが利用可能です。


共用体の利用:

#include <iostream>

union MyUnion {
    int intValue;
    float floatValue;
    char charValue;
};

int main() {
    MyUnion myUnion;

    myUnion.intValue = 42;
    std::cout << "Integer value: " << myUnion.intValue << std::endl;

    myUnion.floatValue = 3.14f;
    std::cout << "Float value: " << myUnion.floatValue << std::endl;

    myUnion.charValue = 'A';
    std::cout << "Char value: " << myUnion.charValue << std::endl;

    return 0;
}


上記の例では、MyUnion を使って異なる型のメンバーにアクセスしています。intValue、floatValue、charValue は同じメモリ領域を共有しているため、一度値が変更されると他のメンバーも同じメモリ領域を見ているため値が変わります。


共用体の利用例:

1.データ変換: 共用体は、異なる型のデータを同じメモリ領域で表現するため、異なる型間でのデータ変換に利用できます。

union DataConverter {
    int intValue;
    float floatValue;
};

int main() {
    DataConverter converter;
    converter.floatValue = 3.14f;

    int convertedIntValue = converter.intValue;
    std::cout << "Converted Integer value: " << convertedIntValue << std::endl;

    return 0;
}


2.メモリ節約:

共用体を使用すると、異なる型のデータを同じメモリ領域で表現できるため、メモリの節約が可能です。ただし、注意が必要で、異なる型を同時に使用する場合には慎重に扱う必要があります。


注意点:

  • 共用体は同じメモリ領域を共有するため、どのメンバーが有効かを正確に把握する必要があります。正しいメンバーにアクセスしないと、不正確な結果が生じます。
  • C++では、共用体を使用する際に型の安全性が低くなるため、代わりに std::variant や std::any などの標準ライブラリのクラスを使用することが推奨されることがあります。

 

C++に戻る