您的位置:首页 > 编程语言 > C语言/C++

C++ union 使用总结

2010-08-25 13:54 281 查看
以前写代码,很少使用union,所以在潜意识中,经常将其忽略。最近要写个生成一段数据的程序,数据类型有两种,一种保护的数据多些,另一种只包含第一种中的部分数据。因为潜意识中没有union,所以开始也没想到用union来实现。给同事讨论时,同事提示用union时,自己才想起来,C++中还有union。

依次为契机,就在网上查了些介绍union的资料,给自己补补课。下面总结了一下使用union的几个注意点,深层次的东西就不去探讨了。

 

1、共享内存

也就是共享起始地址。union变量中,可以包含union中的任何一个成员,但是该union变量的起始地址是固定的。

 

2、取最大成员的空间

既然union变量可以包含union中的任何一个成员,所以分配的空间必须确保能放得下最大的变量,这一点也比较容易理解。

 

3、成员类不可以有构造函数

此处就不对struct和class作区别了。为什么不能包含呢,此处借鉴了:http://tech.china.com/zh_cn/netschool/programme/c/656/20050811/12562605.html

中的思想。不过,本人还是想在此处再说一遍,也为了加深我的记忆。

为什么不允许成员类有构造函数呢,因为union也有难处,呵呵。如果成员有构造函数的话,在定义union(假设其中有类和基本类型的成员)变量的时候就不知道该不该去调用类的构造函数?如果调用了,而只使用了union中的基本类型的成员,显然构造函数的调用是多余的;如果没调,则类中的信息并没有初始化,如果使用,就会造成问题。还有,假如构造函数中分配了资源,在union变量被销毁的时候,也会去调用析构函数,释放资源?再假如,union中的多个类成员的构造函数中都分配了资源,union变量被销毁的时候,会分别调用每个成员析构函数,去释放资源么?

这样只会让union趋于无限复杂。

还有,包含构造函数/析构函数/拷贝构造函数/赋值运算符/虚函数的类成员,在union中都是不被允许的。

 

4、union可以有构造函数

个人觉得这可以算得上语言包容性的一个体现。union和struct、class一样,也是一种类型,既然是一种类型,就可以有构造函数,来构造该类型的对象。虽然这么做是允许的,但该做法并不被推荐。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ struct class 语言 c