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

mat*_*975 19 c++ g++ class 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

hac*_*cks 23

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

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

C++ 11:9类(p5):

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


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

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

9.5工会(第2页):

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

11成员访问控制(第3页):

与关键字定义一个类的成员class都是private默认.一个类的成员与关键字定义struct或者unionpublic默认.

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