union:一种节省空间的类
2015-05-06 15:24
225 查看
当我们给union的某个成员赋值之后,该union的其他成员就变成未定义的状态了。分配给一个union对象的存储空间至少要能容纳它的最大的数据成员。
union不能含有引用类型的成员,除此之外,它的成员可以是绝大多数类型。在C++11新标准中,含有构造函数或析构函数的类类型也可以作为union的成员类型。
为union的一个数据成员赋值会令其他数据成员变成未定义的状态。
含有类类型成员的union
当union包含的是内置类型的成员时,编译器将按照成员的次序依次合成默认构造函数或拷贝控制成员。但是如果union含有类类型的成员,并且该类型自定义了默认构造函数或拷贝控制成员,则编译器将为union合成对应的版本并将其声明为删除的。
例如,string类定义了五个拷贝控制成员以及一个默认构造函数。如果union含有string类型的成员,并且没有自定义默认构造函数或某个拷贝控制成员,则编译器将合成缺少的成员并声明成删除的。如果在某个类中含有一个union成员,而且该union含有删除的拷贝控制成员,则该类与之对应的拷贝控制操作也将是删除的。
使用类管理union成员
对于union来说,要想构造或销毁类类型的成员必须执行非常复杂的操作,因此我们通常把含有类类型成员的union内嵌在另一个类当中。这个类可以管理并控制与union的类类型成员有关的状态转换。举例例子,我们为union添加一个string成员,并将我们的union定义成匿名union,最后将它作为Token类的一个成员。此时,Token类将可以管理union的成员。
为了追踪union中到底存储了什么类型的值,我们通常会定义一个独立的对象,该对象称为union的判别式(discriminant)。
union不能含有引用类型的成员,除此之外,它的成员可以是绝大多数类型。在C++11新标准中,含有构造函数或析构函数的类类型也可以作为union的成员类型。
为union的一个数据成员赋值会令其他数据成员变成未定义的状态。
含有类类型成员的union
当union包含的是内置类型的成员时,编译器将按照成员的次序依次合成默认构造函数或拷贝控制成员。但是如果union含有类类型的成员,并且该类型自定义了默认构造函数或拷贝控制成员,则编译器将为union合成对应的版本并将其声明为删除的。
例如,string类定义了五个拷贝控制成员以及一个默认构造函数。如果union含有string类型的成员,并且没有自定义默认构造函数或某个拷贝控制成员,则编译器将合成缺少的成员并声明成删除的。如果在某个类中含有一个union成员,而且该union含有删除的拷贝控制成员,则该类与之对应的拷贝控制操作也将是删除的。
使用类管理union成员
对于union来说,要想构造或销毁类类型的成员必须执行非常复杂的操作,因此我们通常把含有类类型成员的union内嵌在另一个类当中。这个类可以管理并控制与union的类类型成员有关的状态转换。举例例子,我们为union添加一个string成员,并将我们的union定义成匿名union,最后将它作为Token类的一个成员。此时,Token类将可以管理union的成员。
为了追踪union中到底存储了什么类型的值,我们通常会定义一个独立的对象,该对象称为union的判别式(discriminant)。
相关文章推荐
- 19.6 union一种节省空间的类--使用类管理union成员
- C++中的位域(bit-filed):一种节省空间的成员
- Java从一个连续的自然数区间中,随机获取几个数(这几个数是固定的,一种抽奖算法及节省空间地保存结果)
- C++中的位域(bit-filed):一种节省空间的成员
- union用来节省空间,有些数据项不会同时出现
- C++中的位域(bit-filed):一种节省空间的成员
- 一种节省空间的交换变量的基本算法
- 一种节省空间的交换变量的基本算法
- Ucenter Flickr相册插件 节省主机空间
- struct和union在内存中占用空间大小的计算
- 一种观点:微软是否将太多的内容塞进了System这个根命名空间之中?
- Java一种减少图片存储空间的方法(转换成jpg格式)
- Relay:一种内核到用户空间的高效数据传输技术
- 网页使用下拉框,节省空间
- 如何节省数据库的存储空间
- 移动设计空间节省之道
- 利用phar扩展来节省空间
- IAR编译器如何节省代码占用的flash空间?
- 从git中永久删除文件以节省空间
- 节省空间