在 C++ 中,联合(union)是一种用户定义的数据类型,它允许你在同一个内存位置存储不同的数据类型。但是,联合一次只能存储其成员变量中的一个,这意味着如果你给一个成员赋值,先前存储在另一个成员中的值就会被覆盖。联合的大小由其最大的成员决定。
联合声明
要声明一个联合,使用 union
关键字后跟标签名(联合名)然后声明联合成员及其数据类型放在花括号内。声明以分号结束。
下面是声明联合的语法:
union UnionName {
dataType1 member1;
dataType2 member2;
};
示例
根据上述语法声明联合的一个简短示例如下:
union UnionName {
int intValue;
float floatValue;
char charValue;
};
声明联合变量
声明联合之后,你需要声明它的变量以便访问和操作其成员。
声明联合变量的语法如下:
union_name variable;
访问联合成员
可以在声明联合变量后使用点运算符(.
)来访问联合成员。
访问联合成员的语法如下:
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]
,其中只有一个成员可以在任何给定时刻持有值。 由于联合的大小由最大成员决定,所以在这个例子中(字符数组)。 在 int main()
函数体内声明了一个联合变量 data
。 为了赋值和访问成员,所有成员都通过使用 .
作为 data.intValue
分别赋值。 对于浮点值,浮点成员 floatValue
被赋予值 5.75。 然而,由于联合一次只能持有一个值,所以之前 intValue
的值被覆盖,虽然它仍然占用相同的内存空间。 最后,当代码试图在被字符串赋值后打印 intValue
时,这会导致不确定的行为,因为整型值不再有效,访问它可能会得到意外的结果,正如输出所示。
匿名联合
匿名联合是一种特殊的联合类型,没有名字。这有助于简化代码,允许你直接访问联合成员而不必指定联合变量名。
语法
匿名联合的简单语法如下,声明时不带任何名字,允许直接访问其成员:
union {
dataType1 member1;
dataType2 member2;
};
示例
以下是一个基于上述语法的匿名联合示例:
#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.14f;
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;
dataType2 member2;
};
};
示例
以下是一个基于上述语法的类似联合的类的示例:
#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 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