C++中在什么情况下使用共用体
在结构中,常使用共用体来模拟复杂的数据类型。共用体可将固定的内存空间解释为另一种类型,有些实现利用这一点进行类型转换或重新解释内存,但这种做法存在争议,而且可采用其他替代方式。如下示例程序演示了如何声明和使用共用体:
#include <iostream>
using namespace std;union SimpleUnion
{int num;char alphabet;
};struct ComplexType
{enum DataType{Int,Char} Type;union Value{int num;char alphabet;Value() {}~Value() {}}value;
};void DisplayComplexType(const ComplexType& obj)
{switch (obj.Type){case ComplexType::Int:cout << "Union contains number: " << obj.value.num << endl;break;case ComplexType::Char:cout << "Union contains character: " << obj.value.alphabet << endl;break;}
}int main()
{SimpleUnion u1, u2;u1.num = 2100;u2.alphabet = 'C';// Alternative using aggregate initialization:// SimpleUnion u1{ 2100 }, u2{ 'C' }; // Note that 'C' still initializes first / int membercout << "sizeof(u1) containing integer: " << sizeof(u1) << endl;cout << "sizeof(u2) containing character: " << sizeof(u2) << endl;ComplexType myData1, myData2;myData1.Type = ComplexType::Int;myData1.value.num = 2017;myData2.Type = ComplexType::Char;myData2.value.alphabet = 'X';DisplayComplexType(myData1);DisplayComplexType(myData2);return 0;
}
输出:
sizeof(u1) containing integer: 4
sizeof(u2) containing character: 4
Union contains number: 2017
Union contains character: X
分析:
这个示例表明, 对共用体 u1 和 u2 使用 sizeof()时, 返回的值相同(即为它们预留的内存空间相同),虽然 u1 被用来存储一个 int,而 u2 被用来存储一个比 int 短的 char。这是因为对于共用体,编译器为其预留最大成员占用的内存量。第 9~25 行定义了结构 ComplexType,它包含两个数据成员:类型为枚举 DataType 的 Type 和共用体 Value,其中前者用于指出后者存储的是哪种对象。换句话说,这个结构使用枚举来存储信息类型,并使用共用体来存储实际值。这是共用体的一种常见用法,例如,在Windows 应用程序编程中常用的结构 VARIANT 就以这样的方式使用了共用体。第 27~39 行定义了函数 DisplayComplexType(),它根据枚举的值执行 switch-case 结构中相应的 case 部分。出于演示考虑,这里的共用体包含构造函数和析构函数;就程序清单 9.16 而言,由于共用体包含的是普通数据类型,因此这些构造函数和析构函数是可选的,但如果共用体包含用户定义的数据类型(如类或结构),构造函数和析构函数就可能是必不可少的。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程