从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 ...
随机推荐
- 在DataWorks中实现指定UDF只能被指定账户访问
背景 之前写过一篇文章是关于“DataWorks和MaxCompute内部权限体系的区别”有兴趣的朋友可以点击阅读查看详情.但是还是有些同学会问,我如何在DataWorks中实现我的具体某个Resou ...
- linux ssh密钥认证, 免密码登陆
1. 客户端生成密钥 # mkdir ~/.ssh # chmod ~/.ssh # cd ~/.ssh 生成RSA密钥 # ssh-keygen -t rsa (然后连续三次回车) 2. 把公钥传到 ...
- System.Web.Mvc.FileStreamResult.cs
ylbtech-System.Web.Mvc.FileStreamResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, P ...
- CSS中关于多个class样式设置的不同写法
html中: <div class="containerA"> 这是AAAAAAAAAAAAAAAAAAAAAAA样式 <div class="cont ...
- Git 之 版本回退
1. git log 定义:该命令显示从最近到最远的提交日志.每一次提交都有对应的 commit id 和 commit message.
- 慢日志:mysqlsla
Linux服务器收集到的慢日志文件拿到本地(Windows7)的虚拟机(CentOS6.5)中去分析.首先使用Samba工具配置CentOS和Windows文件共享,然后使用mysqlsla分析慢查询 ...
- 如何使用Pig集成分词器来统计新闻词频?
散仙在上篇文章中,介绍过如何使用Pig来进行词频统计,整个流程呢,也是非常简单,只有短短5行代码搞定,这是由于Pig的内置函数TOKENIZE这个UDF封装了单词分割的核心流程,当然,我们的需求是各种 ...
- kafka offset manage
kafka low api:fetch数据从topic partition offset buffsize长度. 提交一般两个维度:时间维度,满多少条提交(0.8X之前是没这参数) 在0.8.2.2版 ...
- 使用 QuickBI 搭建酷炫可视化分析
随着各行各业大数据的渗透,BI 类数据分析需求与日俱增,如何让可视化更好的展现数据的价值,是 BI 类产品一直努力的方向.对此国内外的BI产品都有自己的方法,如国外大牌的 PowerBI.Tablea ...
- MYSQL实现列拼接,即同一个字段,多条记录拼接成一条
一.首先,新建三张表 DROP TABLE IF EXISTS `article`; CREATE TABLE `article` ( `id` ) unsigned NOT NULL AUTO_IN ...