c++中的union实际上是一个类

Is a union in C++ actually a class?

本文关键字:一个 中的 union 实际上 c++      更新时间:2023-10-16

一个初级开发人员问我是否可以用POD参数重载联合的赋值操作符,这样当联合的实例被赋值给该类型的变量时,联合内相应的数据类型将被写入。我回答说我不这么认为,但随后玩了下面的代码。令我惊讶的是,这段代码实际上被编译了(在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++中,联合是作为一个类在内部实现的,但实际上在c++标准中是这样的吗?或者这只是c++编译器的一些怪癖?

另外,因为这确实动摇了我对联合的理解,我欢迎任何关于以这种方式实现联合的成员函数是否可取的评论。在我的工会的上述实施中是否存在固有的不安全因素?

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

c++中的union实际上是一个类吗?

是的。c++中的联合是一个类:是一种特殊的类

c++ 11:9 Classes (p5):

联合是用类键联合定义的类;它一次只保存一个数据成员


以这种方式为联合重载构造函数等实际上是常见的吗?

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

9.5 union (p2):

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

11成员访问控制(p3):

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

因此,您可以像在类中那样重载构造函数、析构函数和操作符。

相关文章: