关于union的那些事儿

时间:2023-12-14 22:01:38

自从当年明月的《明朝的那些事儿》爆红之后,以***那些事儿命名的文章便层出不穷。个人认为,这样的命名通俗但具有吸引力,容易接地气。哈哈,所以我也写了几篇以《***那些事儿》的文章。当然这篇文章也是为了保持队形,勿怪,看内容。

union是C++里面的一个关键字,说出来真的有些不好意思了,从大学学习C++到现在读研,还真很少用过union。现在在找实习,为了夯实基础,所以对union做下整理和总结。

union的定义

union的中文名字就是共用体,也叫联合体,也是用户的一种自定义类型。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的。

union也有自己的访问权限,默认是公有的,并且也有成员函数。

union PersonalInfo
{
PersonalInfo(){}
PersonalInfo(int a){ age = a; }
char name[];
int age;
};
PersonalInfo perInfo();

union和struct的区别

在结构体中各成员都有自己的内存空间,在联合体中,各成员共享一段内存(内存大小为其中最大的数据成员所占的内存)。

union number
{ /*定义一个联合*/
int i;
struct
{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}num;
num.i = 0x4241; /*联合成员赋值*/
printf("%c%c\n", num.half.first, num.half.second);
num.half.first = 'a'; /*联合中结构成员赋值*/
num.half.second = 'b';
printf("%x\n", num.i);

输出显示:

关于union的那些事儿

使用union需要注意的问题

联合体中不能有静态成员、引用类型的成员,因为不能共享内存。

联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

使用联合可以节省内存空间,但是也有一定的风险:通过一个不适当的数据成员获取当前对象的值。