强制类型转换
C/C++ 为我们提供了强制类型转换,使得我们可以把一块内存看成int,看成double…
例如:
char data[4];
*(int*)data = 114514;
cout << *(int*)data << endl;
*(float*)data = 1919.810;
cout << *(float*)data << endl;
union实际上是类似的东西:
union U
{
int x;
float y;
};
int main()
{
U u;
u.x = 114;
cout << u.x << endl;
u.y = 5.14;
cout << u.y << endl;
}
实际上就是两个变量共用同一块内存。
如果是多个变量的话,union的大小就为最大的那一个变量。
union实现简易的动态类型
利用union我们可以轻易的写出一个简单的动态类型
struct var{
union {
int iv;
double dv;
char* sv;
};
var(const int& v) :iv{ v } {};
var(const double& v) :dv{ v } {};
var(const char* s) {
int len = strlen(s);
sv = new char[len + 1];
memcpy(sv, s, len + 1);
}
};
int main()
{
var x = 1415;
cout << x.iv << endl;
x = 3.14;
cout << x.dv << endl;
x = "hello world";
cout << x.sv << endl;
}
输出
1415
3.14
hello world
union的缺点
如上例:
我们没有释放new出来的内存
这三个值共享一块内存,如果是int,double那还好都在这里
我们没有释放char*指向的内存
也就是后面可能这块内存,后面又变成了int,变成了double,然后又指向了一块new出来的内存
即union无法自动析构。
总结,union的缺点:
- 无法知道当前使用的类型是什么。
- 而且union无法自动调用底层数据成员的析构函数。