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

