C++ union 使用总结
以前写代码,很少使用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一样,也是一种类型,既然是一种类型,就可以有构造函数,来构造该类型的对象。虽然这么做是允许的,但该做法并不被推荐。