C++ の構造体と共用体の比較入門

C++ の構造体と共用体の比較入門

C++ では、struct と Union は両方ともカスタム データ型を定義するために使用されるキーワードですが、その機能は少し異なります。

まず、その基本概念を理解してください。

Struct (構造体): struct は、異なる型の複数のメンバー変数を含めることができるユーザー定義のデータ型であり、関数を含めることができます。これらのメンバー変数は構造内で独立しており、独立したメモリ空間を占有します。構造内のメンバーは、指定されたアクセス権 (パブリック、プライベート、保護) によってアクセス制御できます。

Union: Union もユーザー定義のデータ型ですが、関数を含めることはできません。そのメンバーは同じメモリ空間を共有します。これは、共用体のすべてのメンバー変数が同じメモリ領域に配置され、メモリ空間のサイズが最も長いメンバー変数によって決定されることを意味します。

異なるデータ型を持つ複数のメンバーを含むデータ型を定義する必要がある場合は、struct キーワードを使用できます。たとえば、学生番号、名前、成績、その他のメンバーを含む学生情報のデータ型は、次の構造体を使用して定義できます。

構造体学生 {

    整数ID;

    文字列名;

    フロートグレード;

};

struct を使用して定義された型は非常に直観的で操作が簡単で、セキュリティについてあまり考慮する必要がありません。

メモリを共有できるデータ型を定義する必要がある場合は、union キーワードを使用できます。共用体の異なるメンバーは同じメモリを共有するため、同時に有効になるのは 1 つだけです。たとえば、int、float、char 型のデータを同時に格納できるデータ型を定義するには、union を使用します。

結合データ {

    int i;

    浮動小数点 f;

    文字 str[20];

};

Union キーワードを使用して定義された型は、メンバーが同じメモリを共有するため非常に危険であり、使用を誤るとデータの混乱などの問題が発生する可能性があるため、セキュリティには特に注意する必要があります。

C++ では、構造体と共用体のメンバーはデフォルトでパブリックですが、特定のメンバーをプライベートまたは保護に設定するなど、必要に応じてアクセス許可を設定できます。特定のアクセス許可設定は、メンバー宣言にアクセス修飾子を追加することで実装されます。

構造体には関数メンバーを含めることができますが、共用体には関数メンバーを含めることはできません。

したがって、構造体と共用体の使用は特定の状況に依存し、問題の実際のニーズに応じて選択する必要があります。

struct (構造体) の場合、そのメンバーは次のタイプになります。

データ メンバー: 基本データ型 (整数、浮動小数点、ブール値など)、カスタム データ型 (クラス、構造体、列挙型など) などを含む、任意の有効な C++ データ型を使用できます。

関数メンバ(メンバ関数): 構造体の内部に定義された関数を使用して、構造体のデータを操作できます。関数メンバーは、構造体のプライベート メンバーと保護されたメンバーにアクセスできます。

静的メンバー: 静的データ メンバーまたは静的関数メンバーにすることができます。静的データメンバは構造体型のオブジェクトで共有されるデータであり、静的関数メンバは特定のオブジェクトに依存しない関数です。

struct(構造体)の例は以下のとおりです。

#include <iostream>
using namespace std;

struct Point {
    int x;
    int y;

    void print() {
        cout << "Point: (" << x << ", " << y << ")" << endl;
    }

    static int count;
    static void incrementCount() {
        count++;
    }
};

int Point::count = 0;

int main() {
    Point p1 = {3, 4};
    p1.print();  // 输出: Point: (3, 4)

    Point::incrementCount();
    cout << "Point count: " << Point::count << endl;  // 输出: Point count: 1

    return 0;
}

共用体の場合、次のタイプのメンバーを含めることができます。

データ メンバー: 基本データ型 (整数、浮動小数点、ブール値など)、カスタム データ型 (クラス、構造体、列挙型など) などを含む、任意の有効な C++ データ型を使用できます。ユニオンのデータ メンバーは記憶域を共有し、1 つのメンバーの値のみを格納できることに注意してください。

ネストされた構造体または共用体: ネストされた構造体または共用体は、共用体の内部で定義できます。

結合の例は次のとおりです。

#include <iostream>
using namespace std;

union Data {
    int i;
    float f;
    char c;
};

struct Employee {
    string name;
    union {
        int age;
        float salary;
    };
};

int main() {
    Data d;
    d.i = 42;
    cout << "Data value: " << d.i << endl;  // 输出: Data value: 42

    Employee e;
    e.name = "John";
    e.age = 30;
    cout << "Employee: " << e.name << ", " << e.age << " years old" << endl; // 输出: Employee: John, 30 years old
    
    e.salary = 5000.0;
    cout << "Employee: " << e.name << ", salary: " << e.salary << endl; // 输出: Employee: John, salary: 5000

    return 0;
}

おすすめ

転載: blog.csdn.net/cnds123/article/details/132577934