0
点赞
收藏
分享

微信扫一扫

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

司马吹风 2022-04-27 阅读 60
c++

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

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

  • 比如有一个正常的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会产生一些问题,但是这类事正常使用时也不太可能发生,故可不用担心,大胆用就完了

举报

相关推荐

0 条评论