C++ 联合体 (Union)
联合体(union)是C++中的一种特殊数据类型,它允许在相同的内存位置存储不同的数据类型。联合体与结构体(struct)类似,但关键区别在于联合体的所有成员共享同一块内存空间。
基本语法
union UnionName {
member_type1 member1;
member_type2 member2;
// …
};
特点
共享内存:联合体的大小等于其最大成员的大小,所有成员共享同一内存空间,同一时间只能存储一个成员的值:给一个成员赋值会影响其他成员的值。
节省内存:当需要存储多种类型但同一时间只会使用一种时,联合体比结构体更节省内存
举例说明
#include
using namespace std;
union Data {
int i;
float f;
char str[20];
};
int main() {
Data data;
data.i = 10;
cout << "data.i: " << data.i << endl;
data.f = 220.5;
cout << "data.f: " << data.f << endl;
cout << "data.i is now undefined: " << data.i << endl; // 未定义行为
strcpy(data.str, “C++ Union”);
cout << "data.str: " << data.str << endl;
return 0;
}
匿名联合体
C++允许定义匿名联合体(没有名称的联合体),其成员可以直接在定义联合体的作用域中访问。
#include
using namespace std;
int main() {
union {
int i;
float f;
};
i = 10;
cout << i << endl;
f = 3.14;
cout << f << endl;
return 0;
}
联合体的应用场景:
需要节省内存空间时
需要以不同方式解释同一段内存时
实现变体类型(variant type)
低级编程中访问硬件寄存器
C++11开始,联合体可以包含带有构造函数的类成员,但需要手动管理这些成员的生命周期。
#include
#include
using namespace std;
union U {
int i;
float f;
string s; // C++11允许,但需要手动管理
U() {} // 需要默认构造函数
~U() {} // 需要析构函数
};
int main() {
U u;
new (&u.s) string(“Hello”); // 使用placement new构造
cout << u.s << endl;
u.s.~string(); // 显式调用析构函数
return 0;
}
注意事项
联合体不能继承或作为基类
联合体不能包含虚函数
联合体不能包含引用成员
使用联合体时需要特别注意类型安全
联合体在特定场景下非常有用,但需要谨慎使用以避免未定义行为。
1510

被折叠的 条评论
为什么被折叠?



