C++中使用union的几点思考

C++中使用union的几点思考,第1张

C++中使用union的几点思考,第2张

这段时间整理旧资料,看到了一些文章。虽然都是些小问题,不太可能用到,但也算是一个知识点。我想把它们整理出来,与大家分享。与此相关的文章作者的一些理解是错误的。我写这篇文章是为了纠正作者的一些误解。当然,如果我的理解有什么错误,请批评指正。

C++虽然被B.S .称为新语言,但毕竟和C有着千丝万缕的联系。虽然B.S .一再坚持,但我还是喜欢把C++当成C ++。

在C中我们应该按照约定使用union,这是我在这篇文章中的观点。虽然C++使我们能够扩展一些新的东西,但我建议你不要那样做。看完这篇文章,我想你大概也有同感。

由于C没有类的概念,所有类型实际上都可以看作是基本类型的组合,所以在union中包含struct是很自然的。C++之后,既然普遍认为C++中的struct基本等同于class,那么union中可以有class成员吗?让我们来看看下面的代码:

struct TestUnion
{
TestUnion(){ }
};

typedef union
{
TestUnion obj;
} UT;

int main(void)
{
return 0;
}

编译程序,我们会被告知:
Error c 2620:Union ' _ _ unnamed ':成员' obj '有用户定义的构造函数非平凡的默认构造函数
,如果删除什么也没做的构造函数,一切都会好的。

为什么编译器不允许我们的联合成员有构造函数?这个问题我找不到更权威的解释了。我对这个问题的解释是:

如果C++标准允许我们的union有一个构造函数,那么在空之间分配的时候要执行这个构造函数吗?如果答案是肯定的,那么如果TestUnion的构造函数包含了一些内存分配操作或者其他对整个应用状态的修改,那么我以后要用obj可能是合理的,但是如果我根本不用obj做成员呢?obj的引入对系统状态的修改明显不合理;另一方面,如果答案是否定的,那么我们以后一旦选择obj进行操作,所有的信息都不会被初始化(如果是普通的struct,不会有问题,但是如果有虚函数呢?)。再者,假设我们的Union中不仅有一个TestUnion obj,还有一个TestUnion2 obj2,两者都有构造函数,而且两者都在构造函数中做了一些内存分配的工作(甚至很多其他的事情)。那么,如果先构造obj,再构造obj2,执行结果几乎肯定会造成内存泄漏。

鉴于以上的麻烦(可能会有更多的麻烦),在构造union时,编译器只负责分配空,不负责执行额外的初始化。为了简化工作,只要我们提供构造函数,就会收到上面的错误。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++中使用union的几点思考

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情