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

标签 c++ class g++ unions

一位初级开发人员问我是否可以为带有 POD 参数的 union 重载赋值运算符,以便在将 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;
}

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

另外,因为这真的动摇了我对 union 是什么的理解,我欢迎任何评论以这种方式为 union 实现成员函数是否可取?在我的 union 的上述实现中有什么本质上不安全的吗?

过去,我只在容器类中使用 union ,该容器类有一个指示变量,用于存储 union 中实际写入的类型,老实说,我认为这是它们的主要用途。以这种方式为 union 重载构造函数等实际上很常见吗?

最佳答案

Is a union in C++ actually a class?

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

C++11:9 类 (p5):

A union is a class defined with the class-key union; it holds only one data member at a time


Is it actually common to overload constructors etc for unions in this way?

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

9.5 union (p2):

A union can have member functions (including constructors and destructors), but not virtual (10.3) functions. A union shall not have base classes. A union shall not be used as a base class.

11 成员(member)访问控制(p3):

Members of a class defined with the keyword class are private by default. Members of a class defined with the keywords struct or unionare public by default.

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

关于c++ - C++ 中的 union 实际上是一个类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932389/

相关文章:

c++ - 从类模板类型定义一个独立的静态成员函数

c++ - 为 C++ 编译时找不到符号,但为 C 找到了

C++链接器设计问题

c++ - 循环依赖、 header 和模板

c++ - 向 map 添加类

c++ - 在插槽断开时清除 ExtraSelections Qt

c# - 使用头文件将 get/set 从 C# 转换为 C++

c++ - 对代码的编译方式非常迂腐

c++ - 套接字客户端使用服务器接受的连接发送

c++ - Vector of Vector 如何在内存中对齐?