一位初级开发人员问我是否可以为带有 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
areprivate
by default. Members of a class defined with the keywordsstruct
orunion
arepublic
by default.
因此,您可以像在类中那样重载构造函数、析构函数和运算符。
关于c++ - C++ 中的 union 实际上是一个类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932389/