项目中遇到一个关于union成员变量的问题:当union包含具有构造函数(notrival构造函数)的成员变量时编译器无法编译通过,错误提示为“成员*具有用户定义的构造函数或不常用的默认构造函数”。仔细看了下C++ primer和相关网页的介绍,这是一个涉及union成员变量知识点。
C++中不适合做union成员变量的情形有以下几种:
1、类或结构体中含有nontrival的构造函数(拷贝构造函数)、析构函数、拷贝赋值操作符、虚函数等;
2、类的基类和成员变量中含有1中所述几个函数
3、静态变量
4、变量引用
以上几种情形不适合作为union成员变量,这一点可以由union的定义解释。union成员在内存里面并行存放共享内存区域,大小是union最大数据成员所占的内存空间。在编译时期程序必须知道union各个数据成员所需的内存空间,所以具有构造函数的类型和静态的数据变量不能用在union中。对于情形1,union成员变量中拥有多个构造函数,构造函数执行的顺序就是个大问题,因为后面执行的构造函数或许会覆盖前面执行的效果!更近一步的,如果前面一个构造函数执行了很多重要的操作,但是后面一个构造函数被执行了,并且是在同一片内存区域上执行,就会导致前面的状态丢失,使得程序处于不一致状态,因此编译器就理所当然的禁止了这种行为。静态变量存储在内存全局区,更不可能出现在union中。变量引用指向的变量size尺寸也可能不确定,与union定义冲突。
C中struct可以放心的出现在union中,但是C++中的struct与class没有区别,用在union中时需要注意上述四种情形。当然,结构和类中定义普通的成员函数是没有任何问题的。
C++中union成员变量的特殊说明
最新推荐文章于 2024-03-17 13:49:45 发布