nuion

写在前面

c++union类型
union的特殊点
union的用法
union在c++11之后的新的特点

主要内容

union 是什么

union是一种节省空间的类。是类和class一样定义出来的是一个类型。语法和class或者是struct差不多但是用法不同。
一个union可以有多个数据成员但是任意时刻只有一个数据成员可以使用,当给某个数据成员赋值之后其他的数据成员将是未定义的状态。这个未定义的状态在delete 一个指针之后也出现过,当delete一个指针之后一个指针的值就是未定义的状态。

union的大小将至少是其最大的数据成员的大小。 为什么是至少?
因为还有字节对齐会补一些字节。

union特性

类的某些特性对union都适用,但是并非全部如此。
union不能含有引用类型,其次c++11之后union才能含有有构造函数或者析构函数的类类型。
和class一样:

  • union可以设定其成员的访问属性:public,protected,private。
  • union可以定义包括构造函数和析构函数在内的成员函数
  • 默认情况下union的成员是公有的。

但是:

  • union不能被继承也不能继承别的类型 所以union不能函数有虚函数。
  • union可以使用{}进行初始化但是只能初始化第一个成员。

匿名union

当定义一个匿名的union的时候,编译器会为该union创建一个未命名的对象。
在定义的作用域内该union的成员都是可以访问的。
所以匿名的union是不能包含private和protected成员的也不能定义成员函数。

如和管理和使用union

和普通的类类型成员有一个最大的不同作为union的成员,如果是类类型成员是无法自动销毁的,因为析构函数也不清楚union当前存储的值是什么类型无法确定应该要销毁哪个成员。因为class类的析构函数是可以自动调用成员的析构函数因为类的成员是明确的都存在的只要不是指针类型保存的资源都可以做正确的析构。但是union就不一样了,因为union当前保存的是什么类型只有用户知道,析构函数是不知道的。所以一旦union包含了含有析构函数的类类型对象的时候就需要给该union定义一个析构函数当当前存储的是类类型的时候需要调用该类型的析构函数否则什么也不做。

一般是使用类管理union成员。将union定义为类的匿名union这样在类的内部就可以使用编译器提供的匿名union对象。在类的析构函数里管理union的析构。在类里再定义一个枚举类型变量标识当前union对象存储的值是什么类型,这是union判别式。通过这个在析构函数里就可以判别当前union的存储类型。

union的使用好处

共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。c++嘛,内存的精确控制,效率是第一位的。

用法

union test
{
     char mark;
     long num;
     float score;
};

sizeof(union test)的值为4。因为共用体将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中,而char类型和long类型所占的内存字节数是不一样的,但是在union中都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。
因union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。

union的一个用法就是可以用来测试CPU是大端模式还是小端模式:

#include <iostream>
using namespace std;

void checkCPU()
{
    union MyUnion{
        int a;
        char c;
    }test;
    test.a = 1;
    if (test.c == 1) cout << "little endian" <<endl;
    else cout << "big endian" <<endl;
}

int main()
{
    checkCPU();
    return 0;
}

因为1的4字节16进制数为x00000001,如果是大端那么地址大的地方存放的是低字节如果是小端那么低地址存放低字节。
因为a和c的首地址都是一样的,如果是小端那么test的第一个字节存放的是01就是1如果是大端那么存放是0。所以可以判断大小端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值