c++中的union实际上是一个类
Is a union in C++ actually a class?
一个初级开发人员问我是否可以用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
。使用关键字struct
或union
定义的类的成员默认为public
。
因此,您可以像在类中那样重载构造函数、析构函数和操作符。
相关文章:
- 用C++中的一个变量定义一个常量
- 预处理器:插入结构名称中的前一个行号
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 我想访问std::unique_ptr中的一个特定元素
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 获取向量C++中第一个值和最后一个值的和
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 删除映射和分割错误中的一个过去结束元素
- 如何使用C++读取另一个程序中的源代码输出
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构