Java中的union_从Java到C++——union的用法

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

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

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

// 测试1

union 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);

}结果如下:

3e652f07bcfbaec0e389a0eede45ee4b.png

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

//测试2

union 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;

}结果如下:

163a7ac23d3604e19bfd247dbeae1030.png

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

//测试3

union 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);

}结果如下:

a67d044b5c066bc3adf7acf0f7022a7d.png

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

原文:http://blog.csdn.net/luoweifu/article/details/33342965

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值