C++——Union
作者:互联网
1 基础知识
1.1 Union是什么
它本质是一个类,跟struct性质几乎一致但是数据会共享内存。union变量所占用的内存长度等于最长的成员的内存长度。
内存:
1.联合体是一个结构体;
2.它的所有成员相对于基地址的偏移量都为0;
3.此结构空间要大到足够容纳最"宽"的成员;
4.其内存对齐方式要适合其中所有的成员;
说明:
函数不占内存,但是如果没有成员或者成员都是函数时,内存分配为1,占位,表明存在。
而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
1.2 Union是干嘛的
相比结构体,可以节省内存空间;
可用来测试CPU是大端模式还是小端模式;
可用于做字节的联合,即两个字节的数据拼在一起。
1.3 基本的书写逻辑
1.3.1 标准写法
联合体可以为其成员指定public、protected和private等访问权限,默认情况下,其成员的访问权限为public。
大家写的时候按这个书写。a是被定义的联合体变量定义联合体变量的时候也可以写成:test a;
1.3.2 访问联合体成员
a.mark = 'b'; 赋值只能在程序中进行
说明:
由于union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。--指的是地址一样。
在任意时刻,联合中只能有一个数据成员可以有值。当给联合中某个成员赋值之后,该联合中的其它成员就变成未定义状态了。
不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。
联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。student是一个具体的结构体类型,唯一标识。这里不用再加struct。
一个比较好的经验是,在处理作为类成员的union对象时,为所有union数据类型提供一组访问函数。
union里不能定义静态、引用类型的变量,也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。因为编译器无法保证类的构造函数和析构函数得到正确的调用。
1.3.3 其他类型的联合体
无名联合体
嵌套联合体
2 对基本知识的扩展应用
2.1 POD类型-Plain Old Data
1)没有用户自定义的构造函数、析构函数、拷贝构造函数和移动构造函数。
2)不能包含虚函数和虚基类。
3)非静态成员必须声明为public。
4)类中的第一个非静态成员的类型与其基类不同。
5)在类或者结构体继承时,满足以下两种情况之一:
派生类中有非静态成员,且只有一个仅包含静态成员的基类;
基类有非静态成员,而派生类没有非静态成员。
6)所有非静态数据成员均和其基类也符合上述规则(递归定义),也就是说 POD 类型不能包含非 POD 类型的数据。
7)此外,所有兼容C语言的数据类型都是 POD 类型(struct、union 等不能违背上述规则)
3 在代码中的书写步骤
4 注意事项
按照C中的使用规范去使用union,尽量不要尝试使用任何C++附加特性(比如对象)
5 参考网址
5.1 C++中的union-测试大小端
https://blog.csdn.net/deniece1/article/details/103210859
标签:变量,Union,成员,联合体,C++,union,静态,构造函数 来源: https://blog.csdn.net/weixin_51175167/article/details/116750177