C++ 中的联合
在 C++ 中,联合 是一种用户定义的数据类型,允许您在同一内存位置存储不同的数据类型。但是,联合一次只能存储一个成员变量,这意味着如果您为一个成员赋值,则存储在另一个成员中的先前值将被覆盖。联合的大小取决于其最大成员的大小。
联合声明
要声明联合,请使用 union 关键字,后跟 tag_name(联合名称),然后在花括号内声明联合成员及其数据类型。声明以分号结尾。
以下是声明联合的语法 -
union UnionName { dataType1 member1; dataType2 member2; // more members };
示例
以下是基于上述语法声明联合体的简短示例 -
union UnionName { int intValue; // 整数值成员 float floatValue; // 浮点值成员 char charValue; // 字符值成员 };
声明联合体变量
声明联合体后,需要声明其变量以访问和操作其成员。
以下是声明联合体变量的语法 -
union_name 变量;
访问联合体成员
声明联合体变量后,可以使用点运算符 (.) 访问联合体成员。
以下是访问联合成员的语法 -
union_variable.member
C++ 联合示例
以下是一个完整的联合示例,演示了它的工作原理 -
#include <iostream> #include <cstring> using namespace std; union Data { int intValue; // 整数值成员 float floatValue; // 浮点值成员 char strValue[50]; // 字符串值成员 }; int main() { // 定义一个联合变量 Data data; data.intValue = 2006; cout << "TutorialsPoint: Founded in " << data.intValue << endl; // 覆盖先前的整数值 data.floatValue = 5.75f; cout << "My Float value is: " << data.floatValue << endl; // 覆盖先前的浮点值 strcpy(data.strValue, "Hello TutorialsPoint Learner"); cout << data.strValue << endl; // 分配字符串后访问整数 cout << "Integer after string assignment: " << data.intValue << endl; // 未定义的行为 return 0; }
当编译并执行上述代码时,它会产生以下结果 -
TutorialsPoint: Founded in 2006 My Float value is: 5.75 Hello TutorialsPoint Learner Integer after string assignment: 1819043144
说明
上述示例演示了联合体的使用、创建和访问方法。
- 首先,定义一个名为 Data 的联合体,它包含三个成员:int intValue、float floatValue 和 char strValue[50],其中只有一个成员在任意时刻可以保存值。
- 由于联合体的大小由其中最大的成员决定,在本例中为 char 数组。
- 在 int main() 函数体中声明了一个联合变量 data。
- 要分配和访问成员,所有成员都使用"."赋值。分别为 data.intValue。
- 对于浮点型值,浮点型成员 floatValue 被赋值为 5.75。
- 但是,由于联合体一次只能保存一个值,因此 intValue 的先前值会被覆盖,尽管它仍然占用相同的内存空间。
- 现在,当代码在 intValue 被字符串赋值覆盖后尝试打印它时,最终会导致 未定义的行为,整数值不再有效,访问它可能会得到与输出中所示的意外结果。
匿名联合
匿名联合是一种特殊类型的联合,它没有名称。这有助于简化代码,因为您可以直接访问联合成员,而无需指定联合变量名称。
语法
以下是匿名联合的简单语法,它声明时没有任何名称,允许直接访问其成员 -
union { dataType1 member1; dataType2 member2; // additional members... };
示例
以下是基于上述语法的匿名联合示例 -
#include <iostream> #include <cstring> using namespace std; // 使用标准命名空间 int main() { // 匿名联合声明 union { int intValue; float floatValue; char strValue[50]; }; // 分配一个整数值 intValue = 2006; cout << "Integer Value: " << intValue << endl; // 分配一个浮点值(覆盖先前的整数值) floatValue = 3.14 f; cout << "Float Value: " << floatValue << endl; // 分配一个字符串值(覆盖先前的浮点值) strcpy(strValue, "Hello, TutorialsPoint Learner!"); cout << "String Value: " << strValue << endl; // 字符串赋值后访问整数(未定义的行为) cout << "Integer after string assignment: " << intValue << endl; return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Integer Value: 2006 Float Value: 3.14 String Value: Hello, TutorialsPoint Learner! Integer after string assignment: 1819043144
类联合体
在 C++ 中,类联合体被定义为包含至少一个匿名联合体作为成员的类。这些匿名联合体中定义的数据成员称为变体成员。这些数据结构封装了联合体的概念,但提供了额外的类型安全性和可用性特性。
它们通常结合使用成员变量和某种机制(例如枚举器)来跟踪当前处于活动状态的类型。
语法
以下是类联合体的基本语法,其中使用class关键字定义类,后跟类名(此处为 UnionLikeClass)
class UnionLikeClass { public: union { dataType1 member1; // 类型为 dataType1 的成员 dataType2 member2; // 类型为 dataType2 的成员 // 附加成员... }; };
示例
以下是基于上述语法的类似 Union 的类的示例:
#include <iostream> #include <cstring> using namespace std; class UnionLikeClass { public: // 匿名联合声明 union { int intValue; // 整数值成员 float floatValue; // 浮点值成员 char strValue[50]; // 字符串值成员 }; // 显示当前值的方法 void display() { cout << "Integer Value: " << intValue << endl; cout << "Float Value: " << floatValue << endl; cout << "String Value: " << strValue << endl; } }; int main() { // 创建 UnionLikeClass 的实例 UnionLikeClass data; data.intValue = 2006; cout << "TutorialsPoint: Founded in " << data.intValue << endl; data.floatValue = 3.14f; cout << "Assigned Float Value: " << data.floatValue << endl; // 分配一个字符串值(覆盖先前的浮点值) strcpy(data.strValue, "Hello, Union Like Class!"); cout << "Assigned String Value: " << data.strValue << endl; // 字符串赋值后访问整数(未定义的行为) cout << "Integer after string assignment: " << data.intValue << endl; // 未定义的行为 return 0; }
TutorialsPoint: Founded in 2006 Assigned Float Value: 3.14 Assigned String Value: Hello, Union Like Class! Integer after string assignment: 1819043144