C ++中的联合实际上是一个类吗?

时间:2014-05-29 11:35:07

标签: c++ class g++ unions

一位初级开发人员问我是否有可能为具有POD参数的联合重载赋值运算符,以便当将union的实例分配给该类型的变量时,将会写入union中的相应数据类型。我回答说我不这么认为,但后来玩了下面的代码。令我惊讶的是,这段代码实际编译(在Ubuntu 12.04上使用g ++版本4.6.3)

union unMember 
{

  float fData;
  unsigned int uiData;
  unMember():uiData(0) {};
  unMember(float data):fData(data) {};
  unMember(unsigned int data):uiData(data) {};

  operator float() {return fData;};
  operator unsigned int() {return uiData;};

  unMember& operator=(float data) {fData = data;return *this;};
  unMember& operator=(unsigned int data) {uiData = data; return *this;};

  float GetFloat() const {return fData;};
};

int main () {

  float fTest = 1.0;
  unsigned int uiTest = 10;
  unMember data = fTest;

  unMember data2 = uiTest;
  unMember data3 = data2;

  float f = data.GetFloat();

  return 0;
}

这让我意识到我对联合几乎一无所知(至少在C ++而不是C语境中),因为我真的没想到能够以这种方式为联合定义成员函数。上面的代码告诉我,在C ++中,union在内部实现为一个类,但实际上是C ++标准中的情况,还是这只是g ++编译器的一些怪癖?

另外,因为这确实动摇了我对工会的理解,我欢迎任何关于以这种方式为工会实施成员职能是否明智的评论?在我的工会的上述实施中是否有任何本质上不安全的东西?

过去我只使用了一个容器类中的联合,这个容器类有一个指示器变量,用于存储在联合中实际写入的类型,说实话我认为这是他们的主要用途。以这种方式为工会重载构造函数等是否常见?

1 个答案:

答案 0 :(得分:21)

  

C ++中的联合实际上是一个类吗?

是。在C ++中,union是一个类:一种特殊的类

C ++ 11:9类(p5):

  

union是一个用class-key union定义的类;它一次只能容纳一个数据成员


  

以这种方式为工会重载构造函数等是否常见?

联盟是一个特殊的类,有一些限制:

9.5联盟(第2页):

  

union可以具有成员函数(包括构造函数和析构函数),但不具有虚函数(10.3)。工会不得有基类。联合不得用作基类。

11会员访问控制(p3):

  

默认情况下,使用关键字class定义的类的成员为private。默认情况下,使用关键字structunion定义的类的成员为public

因此,您可以像在类中一样重载构造函数,析构函数和运算符。