博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从Java到C++——union的用法
阅读量:6457 次
发布时间:2019-06-23

本文共 2787 字,大约阅读时间需要 9 分钟。

hot3.png

你是否记得union这个东西,在上大学的时候我们用的是潭浩强的《C语言程序设计》,里面把它译作是共用体。“共用体”,虽然翻译得特别别扭,但却正好说明了它的特性和用途。

联合union,也有翻译成共用体的是一种特殊的结构(或说类)。一个union可以有多个数据成员,但是在任意时刻只有一个成员有值。Union具有以下几个特点:

1.一个union可以有多个不同类型的数据成员, 但在某一时刻只有一个成员有值(即只有一个成员是有效的) 给union的某个成员赋值后,该union的其它成员就成未定义的状态了。如下示例:

// 测试1union Token{    char cVal;      //char 类型    int nVal;       //int类型    double dVal;    //double类型};void PrintToken(const Token& t){    cout << "char:   " << t.cVal << endl;    cout << "int:    " << t.nVal << endl;    cout << "double: " << t.dVal << endl;}void TestUnion1(){    cout << "Print first:"<< endl;    Token t;    t.cVal = 'k';    PrintToken(t);    cout << endl << "Print second:"<< endl;    t.nVal = 5;    PrintToken(t);    cout << endl;    cout << endl << "Print third:"<< endl;    t.dVal = 10.2;    PrintToken(t);}
结果如下:

2.分配给一个union对象的存储空间,至少要能容纳它的最大的数据成员(即一个union的存储空间至少要为其各个成员的数据类型中占字节数最大的一个成员的字节大小)。如下示例:

//测试2union Token{    char cVal;      //char 类型, 1 个字节    int nVal;       //int类型, 4个字节    double dVal;    //double类型, 8个字节};union Token2{  short snVal;      //2个字节  int nVal;         //4个字节};union Token3{  int nVal;         //4个字节  float fVal;       //4个字节  long lVal;        //4个字节  char arr[20];     //20个字节};void TestUnion2(){    cout << "size of Token: " << sizeof(Token) << endl;    cout << "size of Token2:" << sizeof(Token2) << endl;    cout << "size of Token3:" << sizeof(Token3) << endl;}
结果如下:

3.如果一个union结构中有多个相同类型的数据成员,则这些数据成员会有相同的值。union应该是根据成员占用的内存最大的数据类型的大小分配一段内存空间,不管你使用的是那个成员变量,内存空间地址和大小都相同。当然以上就是根据测试的例子个人进行的推断,在这个例子中char的空间首地址输出有问题,可能跟操作系统有关系,我用的是UbuntuLinux操作系统,如下示例:

//测试3union Token4{    unsigned char cVal1;    unsigned char cVal2;    short int snVal;    int nVal;    long lVal;    long long llVal;    double dVal;    double dVal2;};void PrintToken4(const Token4& t){    cout << "char1:    " << t.cVal1 << "\t\t\t" << &t.cVal1 << endl;    cout << "char2:    " << t.cVal2 << "\t\t\t" << &t.cVal2 << endl;    cout << "short int:" << t.snVal << "\t\t\t" << &t.snVal << endl;    cout << "int:      " << t.nVal << "\t\t" << &t.nVal << endl;    cout << "long:     " << t.lVal << "\t\t" << &t.lVal << endl;    cout << "long long:" << t.llVal << "\t" << &t.llVal << endl;    cout << "double1:  " << t.dVal << "\t\t" << &t.dVal << endl;    cout << "double2:  " << t.dVal2 << "\t\t" << &t.dVal2 << endl;}void TestUnion4(){    cout << "Print first:"<< endl;    Token4 t;    t.cVal1 = 'A';    PrintToken4(t);    cout << endl << "Print second:"<< endl;    t.nVal = 255;    PrintToken4(t);    cout << endl;    cout << endl << "Print third:"<< endl;    t.dVal = 10.2;    PrintToken4(t);}
结果如下:

4.C++的早期版本中(C++11标准之前),union不能含有定义了拷贝构造函数或拷贝控制成员的类类型成员。但在C++11标准之后取消了这一限制,可以含有类的成员,如string及自己定义的类。含有拷贝构造函数或拷贝控制成员的类类型成员的union比较复杂,可以去参考C++11标准的相关文档。

转载于:https://my.oschina.net/verynix/blog/365798

你可能感兴趣的文章
laravel 使用QQ邮箱发送邮件
查看>>
用javascript验证哥德巴赫猜想
查看>>
Shell编程-环境变量配置文件
查看>>
[Unity3d]DrawCall优化手记
查看>>
Struts2和Spring MVC的区别
查看>>
理解Javascript参数中的arguments对象
查看>>
p2:千行代码入门python
查看>>
bzoj1106[POI2007]立方体大作战tet*
查看>>
spring boot configuration annotation processor not found in classpath问题解决
查看>>
【转】正则基础之——神奇的转义
查看>>
团队项目测试报告与用户反馈
查看>>
对软件工程课程的期望
查看>>
Mysql中文字符串提取datetime
查看>>
IOS 与ANDROID框架及应用开发模式对比一
查看>>
由中序遍历和后序遍历求前序遍历
查看>>
我学习参考的网址
查看>>
easyui的combotree以及tree,c#后台异步加载的详细介绍
查看>>
1、串(字符串)以及串的模式匹配算法
查看>>
[Processing]点到线段的最小距离
查看>>
考研随笔2
查看>>