union

union实际是一种用来节省空间的存储方式。有的时候一个东西有多种存储方式,比如string,int,double等等,但任何时候的任何一种就能代表一整个整体,因此我们任何时候只需要其中的一种存在即可,也就是说这几种是互斥的存在,有一个,其他的就不会存在,并且占用同一块空间来节省空间。

本身仍然是一个类,但是是类似struct的,可以有折构,构造等等,以及各种不同类型的变量各一个。使用的时候仍然是指定对应类型的变量进行赋值,给一个类型赋值就会清除其他的值,当访问一个不是当前存储类型的类型时是未定义的。

当这个union类没有名字时,将会创建一个未命名的union对象,从表象看起来就好像可以直接使用union中的变量一样。

但是union有一个最大的问题就是,它本身只能够处理内置类型,如果涉及到自定义类类型,并且这个类类型还有折构,拷贝等控制函数,那么就必须自己定义其中的很多操作。因为,更换存储的类型这件事情union是通过先折构原本的对象再通过构造函数创建一个新的对象来实现的,而union折构的过程中并不会调用类类型自定义的折构函数,然后就出问题了。

因此一般管理存储类类型的union都会给这个union套一个类来控制它的行为。一般要实现构造,拷贝构造,拷贝赋值和折构函数。并且另外通过创建一个enum对象来存储当前存储的类型。

另外,要注意的是,在构造的时候需要在原本的内存位置来构造来节省空间,因此要用到定位new的方式。

c++17提供了variant来替代union,它可以自行处理类对象,并自动存储当前保存的类型。但是效率比union略低。


union
https://lhish.github.io/project/hide/union/
作者
lhy
发布于
2024年6月30日
许可协议