background image

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

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

  C++虽说被 B.S.称作一门新语言,但它毕竟与 C 有着千丝万缕的联系,虽然 B.S.一再
坚持,但我还是愿意把 C++看作是 C ++。

  我们应该按照 C 中的 convention 去使用 union,这是我这篇文章要给出的观点。虽然
C++使得我们可以扩展一些新的东西进去,但是,我建议你不要那样去做,看完这篇文
章之后,我想你大概也是这么想的。

  C 由于没有类的概念,所有类型其实都可以看作是基本类型的组合,因此在 union 中
包含 struct 也就是一件很自然的事情了,到了 C++之后,既然普遍认为 C++中的 struct 与
class 基本等价,那么 union 中是否可以有类成员呢?先来看看如下的代码:

  struct TestUnion
  {
  TestUnion() {}
  };

  typedef union
  {
  TestUnion obj;
  } UT;

  int main (void)
  {
  return 0;
  }

  编译该程序,我们将被告知:
  error C2620: union ‘__unnamed‘ : member ‘obj‘ has user-defined constructor or non-trivial 
default constructor
  而如果去掉那个什么也没干的构造函数,则一切 OK。

  为什么编译器不允许我们的 union 成员有构造函数呢?我无法找到关于这个问题的比
较权威的解释,对这个问题,我的解释是:

  如果 C++标准允许我们的 union 有构造函数,那么,在进行空间分配的时候要不要执
行这个构造函数呢?如果答案是 yes,那么如果 TestUnion 的构造函数中包含了一些内存分