C++中union成员变量的特殊说明

原帖地址:http://blog.csdn.net/ocean2006/article/details/5789352



    项目中遇到一个关于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中时需要注意上述四种情形。当然,结构和类中定义普通的成员函数是没有任何问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值