首页 > C/C++语言 > C/C++基本语法 > C++中使用union的几点思考(2)
2006
05-18

C++中使用union的几点思考(2)

 同理,除了不能加构造函数,析构函数/拷贝构造函数/赋值运算符也是不可以加。

  此外,如果我们的类中包含了任何virtual函数,编译时,我们将收到如下的错误信息:
  error C2621: union ‘__unnamed‘ : member ‘obj‘ has copy constructor

  所以,打消在union中包含有构造函数/析构函数/拷贝构造函数/赋值运算符/虚函数的类成员变量的念头,老老实实用你的C风格struct吧!
  不过,定义普通的成员函数是OK的,因为这不会使得class与C风格的struct有任何本质区别,你完全可以将这样的class理解为一个C风格的struct + n个全局函数。

  现在,再看看在类中包含内部union时会有什么不同。看看下面的程序,并请注意阅读程序提示:

  class TestUnion
  {
  union DataUnion
  {
  DataUnion(const char*);
  DataUnion(long);
  const char* ch_;
  long l_;
  } data_;

  public:
  TestUnion(const char* ch);
  TestUnion(long l);
  };

  TestUnion::TestUnion(const char* ch) : data_(ch) // if you want to use initialzing list to initiate a nested-union member, the union must not be anonymous and must have a constructor。
  {
  }

  TestUnion::TestUnion(long l) : data_(l)
  {
  }

  TestUnion::DataUnion::DataUnion(const char* ch) : ch_(ch)
  {
  }

  TestUnion::DataUnion::DataUnion(long l) : l_(l)
  {
  }

  int main (void)
  {
  return 0;
  }

  正如上面程序所示,C++中的union也可以包含构造函数,但是,这虽然被语言所支持,但实在是一种不佳的编程习惯,因此,我不打算对上面的程序进行过多的说明。我更推荐如下的编程风格:

  class TestUnion
  {
  union DataUnion
  {
  const char* ch_;
  long l_;
  } data_;
  
  public:
  TestUnion(const char* ch);
  TestUnion(long l);
  };

  TestUnion::TestUnion(const char* ch)
  {
  data_。ch_ = ch;
  }

  TestUnion::TestUnion(long l)
  {
  data_。l_ = l;
  }

  int main (void)
  {
  return 0;
  }

  它完全是C风格的。


留下一个回复