从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);
}
结果例如以下:
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;
}
结果例如以下:
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);
}
结果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVvd2VpZnU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
4.C++的早期版本号中(C++11标准之前)。union不能含有定义了拷贝构造函数或拷贝控制成员的类类型成员。但在C++11标准之后取消了这一限制。能够含有类的成员,如string及自定义的类。含有拷贝构造函数或拷贝控制成员的类类型成员的union比較复杂,能够去參考C++11标准的相关文档。
从Java到C++——union的使用方法的更多相关文章
- java.lang.String.getBytes(String charsetName)方法实例
java.lang.String.getBytes(String charsetName) 方法编码将此String使用指定的字符集的字节序列,并将结果存储到一个新的字节数组. 声明 以下是java. ...
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...
- Java并发编程基础--基本线程方法详解
什么是线程 线程是操作系统调度的最小单位,一个进程中可以有多个线程,这些线程可以各自的计数器,栈,局部变量,并且能够访问共享的内存变量.多线程的优势是可以提高响应时间和吞吐量. 使用多线程 一个进程正 ...
- [java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]> [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...
- js,java,浮点数运算错误及应对方法
js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...
- Java小知识--length,length(),size()方法详细介绍
Java中length,length(),size()区别 length属性:用于获取数组长度. eg: int ar[] = new int{1,2,3} /** * 数组用length属性取得长度 ...
- Java 静态变量,常量和方法
static 关键字 例如:在球类中使用PI这个常量,可能除了本类需要这个常量之外,在另外一个圆类中也需要使用这个常量.这时没有必要 在两个类中同时创建PI这个常量,因为这样系统会将这两个不在同一个类 ...
- java内省机制及PropertyUtils使用方法
背景 一般情况下,在Java中你可以通过get方法轻松获取beans中的属性值.但是,当你事先不知道beans的类型或者将要访问或修改的属性名时,该怎么办?Java语言中提供了一些像java.bean ...
- java中String对象的split方法
在java.lang包中有String.split()方法,返回是一个String[]数组,今天碰到一个自己没注意的问题: 1.特殊分隔符 String str1 = "123|456|78 ...
随机推荐
- 阿里云 Aliplayer高级功能介绍(四):直播时移
基本介绍 时移直播基于常规的HLS视频直播,直播推流被切分成TS分片,通过HLS协议向播放用户分发,用户请求的m3u8播放文件中包含不断刷新的TS分片地址:对于常规的HLS直播而言,TS分片地址及相应 ...
- day09 samba、nginx服务配置
samba 1.环境准备 [root@localhost ~]# iptables -F #清除防火墙配置 [root@localhost ~]# systemctl stop firewalld # ...
- csps模拟测试7273简单的操作小P的2048小P的单调数列小P的生成树
题面:https://www.cnblogs.com/Juve/articles/11678564.html 简单的操作: 考场上sb了,没看出来 如果有奇环一定不能缩成一条链,判掉奇环后就是bfs最 ...
- 0906NOIP模拟测试赛后总结
我进前十辣.然而有10个大佬去学LCT了于是没有考试. Dybala神和exzkt神分-rank1,奶风神和林哥分-rank3,wc.miemeng和DuanYue神140分-rank5. 我.ooo ...
- Python更新后ros用不了的bug
一.原因 我同时安装了python2.7 和3.5,而且将python默认配置为python3.5,所以ros并不支持,所以提示找不到. 2.解决方式 通过修改不同版本的python的优先级,将pyt ...
- 在Xsheel Linux上安装nodejs和npm
最近window系统转向linux系统开发,linux系统的确适合程序员的开发. 作为前端安装了nodejs和npm,遇到了一些坑,赶紧记录下来 第一种安装方法:安装nodejs : sudo a ...
- 83 落单的数 II
原题网址:http://www.lintcode.com/zh-cn/problem/single-number-ii/ 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这 ...
- 抓包:MySQL Sniffer
1.依赖文件安装 依赖glib2-devel.libpcap-devel.libnet-devel [root@VMUest ~]# yum install cmake [root@VMUest ~] ...
- pycharm使用教程链接+部分练习题01
pycharm安装: https://www.cnblogs.com/jin-xin/articles/9811379.html pycharm使用教程: https://edu.51cto.com/ ...
- Spring cloud config client获取不到配置中心的配置
Spring cloud client在配置的时候,配置文件要用 bootstrap.properties 贴几个说明的链接.但是觉得说的依然不够详细,得空详查. 链接1 链接2 链接3 原文地址:h ...