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;
}