联合体(union) in C++【C++学习笔记】

本文探讨了C++中的联合体如何通过共享内存实现不同类型之间的转换,重点讲解了其在命名变量和数据结构重组中的应用,以及类型双关的概念。通过实例说明了联合体在提高代码灵活性和可读性方面的优势,同时提到了其潜在问题及注意事项。
摘要由CSDN通过智能技术生成

67.联合体(union) in C++

联合体有点像类类型,或者结构体类型,只不过它一次只能占用一个成员的内存

比如结构体中有四个成员,每一个成员都有着占着不同的字节。而一个联合体只能有一个成员,也就是说如果声明了四个浮点数abcd,他们共用一个内存空间,即4个字节

而人们用联合体来做的事情,是和类型双关紧密相关的

在你想给同一个变量取两个不同的名字时,它真的很有用(引用:???),当然,可读性上是一定比引用要好的

  • 比如有一个正常的abc,有一个坐标轴上的xyz,我想让abc和xyz一一对应,则可以把a和x放一个union,b和y放一个union,以此类推

通常union是匿名使用的,但是匿名union不能含有成员函数

union { };,注意这里是有分号的!!

#include <iostream>
int main() {
    //匿名使用,即是不写名字,惊了
    union {
        float a;
        int b;
    };	//注意这里要加分号!!!!
    a = 2.0f;
    std::cout << a << ' ' << b << std::endl;
    //会得到输出: 2 107165123
    //这里前面的a是正常的,但是第二个输出就很诡异
    //出现这种状况的原因是:取了组成浮点数的内存,然后把它解释成一个整型(类型双关)
}

故此,union通常被用来做类型双关比如用着int的内存,却将这段内存解释成double去使用

来看看一个更有用的例子

#include <iostream>
#include <vector>

struct vec2 {
    int a, b;
}
struct vec4 {
    int a, b, c, d;
}

当想把vec4中的四个元素当作两个vec2来看待的时候,union就排上用场了

#include <iostream>
#include <vector>
using namespace std;
struct vec2 {
    int x, y;
}
struct vec4 {
    union {
        struct {
            int a, b, c, d;
        }
        struct {
            vec2 v1, v2;	//因为两个结构体共用一个内存,而abcd内存分布上又是连续的,所以可以用两个vec2代替abcd
        }
    }
}
int main() {
    vec4 temp;
    cout << temp.v1.x << temp.v2.y;	//等同于把a,b输出出去
}

如此,用多种方法来处理相同的数据是,union都非常有用,并且**用union进行类型双关可读性更佳!**但union会产生一些问题,但是这类事正常使用时也不太可能发生,故可不用担心,大胆用就完了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值