一位初级开发人员问我是否有可能为具有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 ++编译器的一些怪癖?
另外,因为这确实动摇了我对工会的理解,我欢迎任何关于以这种方式为工会实施成员职能是否明智的评论?在我的工会的上述实施中是否有任何本质上不安全的东西?
过去我只使用了一个容器类中的联合,这个容器类有一个指示器变量,用于存储在联合中实际写入的类型,说实话我认为这是他们的主要用途。以这种方式为工会重载构造函数等是否常见?
答案 0 :(得分:21)
C ++中的联合实际上是一个类吗?
是。在C ++中,union是一个类:一种特殊的类。
union是一个用class-key union定义的类;它一次只能容纳一个数据成员
以这种方式为工会重载构造函数等是否常见?
联盟是一个特殊的类,有一些限制:
union可以具有成员函数(包括构造函数和析构函数),但不具有虚函数(10.3)。工会不得有基类。联合不得用作基类。
默认情况下,使用关键字
class
定义的类的成员为private
。默认情况下,使用关键字struct
或union
定义的类的成员为public
。
因此,您可以像在类中一样重载构造函数,析构函数和运算符。