编程语言
首页 > 编程语言> > C++——Union

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