【C++】共用体简单小结

in 默认分类 with 0 comment

前言

小小的记录一下,之前一直不知道有共用体这个东西,只知道有结构体。

概括

共用体是一种数据格式,和结构体对比,一样的是他们都能储存不同的数据格式,但是不一样的地方在于结构体能够储存多种数据格式,但是共同体只能储存其中一种数据格式。比如下面的例子

例子

定义

    union my_type
    {
        int integer;
        bool boolean;
    };

使用

    my_type a;
    a.integer = 15;
    cout << a.integer;
    a.boolean = true;
    cout << a.boolean;  // 此时a原本的15将会丢失

上面的例子生命了这有一个类型为my_type的共同体,它里面可以有2中种类型,分别是intbool。但是在一个共同体对象只能存储上面类型的其中一种类型,当我们对其赋值不同类型的时候,那么他之前类型保存的变量将会丢失。

值得一提的是共同体占用的内存空间是所有其允许的类型中占用内存最大的那个类型所需占用的内存空间。

共同体可以嵌套在结构体中,而且类似于结构体,也存在匿名共同体。当共同体的为匿名共同体的时候,其成员变量将会成为位于相同地址的变量,所以我由我们自身判断当前是那个类型。

嵌套匿名共同体

    struct widget
    {
        int type;
        union
        {
            long id_num;
            char id_str[20];
        }
    }

调用

    widget w1;
    ... // 省略初始化
    cout << w1.type;
    if(w1.type == 0)
    {
        cout << w1.id_num;
    }
    else
    {
        cout << w1.id_str;
    }

在上面的例子中,由于共同体是匿名的,所以我们可以直接通过写共同体里面的成员变量名称来使用。但是需要小心的是上面id_numid_str是存在于同一个内存地址中,我们得自行去判断其类型(这里是使用了共同体外面的type变量来标记判断)。

用处

常用于节省内存