php union用法,C++_C语言、C++中的union用法总结,开始的话 已经好长时间没有 - phpStudy...
内存对齐的问题了)。而对于union来说,在谭浩强的《C语言程序设计》中这么说:union变量所占用的内存长度等于最长的成员的内存长度。很显然,这是不对的,对于union所占用的内存大小,需要考虑内存对齐的问题。这就是为什么sizeof(union test)的值为4啦。
C中使用union
说的再好,再多,终归都是要在使用的,下面就好好的说说C中使用union。和struct一样,union只有先定义了共用体变量才能引用它。而且不能直接引用共用体变量,而只能引用共用体变量中的成员。就像我上面定义的union test。我们不能像下面这样直接引用union:
union test a;
printf("%d", a);
这种直接引用是错误的,由于a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a,这样使编译器无法确定究竟输出的哪一个成员的值。所以,应该写成下面这样:
printf("%d", a.mark);
同时,在使用union的时候,我们还需要注意以下的几点:
1.同一个内存段可以用来存放几种不同类型的成员,但在每一个时刻只能存在其中一种,而不是同时存放几种。也就是说,每一瞬间只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。
2.共用体变量中起作用的成员是最后一个存放的成员,在存入一个新的成员后,原有的成员就失去作用。比如以下的代码:
#include
using namespace std;
union test
{
char mark;
long num;
float score;
}a;
int main()
{
// cout<
a.mark = 'b';
cout<
cout<
cout<
a.num = 10;
cout<
cout<
cout<
a.score = 10.0;
cout<
cout<
cout<
return 0;
}
所以,在使用union的时候,要十二分的小心的。
3.由于union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。
4.不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。
5.union类型可以出现在结构体类型定义中,也可以定义union数组,反之,结构体也可以出现在union类型定义中,数组也可以作为union的成员。
按理说,总结到这里,C语言中的union也就没什么更多的要说了。但是,有一种东西叫做C++,在这个C++中有一种东西叫做类。
当union遇到对象
就单单C中的union,上面的总结已经够用了,但是,现在偏偏又有一个叫做C++的东西;当union遇到了C++中的对象时,一切又变得剪不断,理还乱。上面总结的union使用法则,在C++中依然适用。本来union本就是从C语言中的,如果我们在C++中继续按照C语言的那种方式使用union,那是没有问题的。如果我们在union中放一个类的对象呢?结果会怎么样?比如有以下代码:
#include
using namespace std;
class CA
{
int m_a;
};
union Test
{
CA a;
double d;
};
int main()
{
return 0;
}
可以看到,没有问题;如果我们在再类CA中添加了构造函数,或者添加析构函数,我们就会发现程序就会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。
结束的话
我们都在玩那些高大上的东西,猛回头,发现身后却又一个大坑。打开尘封了多年的《C语言程序设计》(谭浩强著),小心翼翼的拭去封面上的尘土,思绪立刻被拉回到大一。那些年,我那清纯的大一。对大学的憧憬,对计算机的好奇,对编程的未知,就是这本书,这本该死的《C语言程序设计》,把我带上了“程序猿”这条不归路。说多了,都是泪,当你看我这篇文章时,你应该懂我的。CodeMonkey~~~,这条不归路,且行且珍惜。
===修改日志===
2014年9月11日 删除了文中“不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。”这样的描述,非常感谢Cassie_Lcy的指正,而且还在评论中附上了验证代码,非常感谢;同时,我也非常抱歉,对于这点没有验证过的知识,就进行了总结,对大家造成了一定的误导,sorry。一定要注重求学的严谨性。相关阅读:
Win10语音识别怎么关闭?Win10关闭语音识别的方法
Win8.1系统关闭Secure Boot安全启动后开机画面变红的故障原因及解决方法
Win10 Mobile 10.0.12609.0 新版曝光
Android编程实现ImageView图片抛物线动画效果的方法
js实现背景图片感应鼠标变化的方法
javascript学习笔记(四)function函数部分
C语言求Fibonacci斐波那契数列通项问题的解法总结
解析php取整的几种方式
ASP.NET OutputCache详解
javascript中匹配价格的正则表达式
javascript控制层显示或隐藏的方法
Linux下grep命令使用实例
PHP模拟post提交数据方法汇总
jquery根据锚点offset值实现动画切换
php union用法,C++_C语言、C++中的union用法总结,开始的话 已经好长时间没有 - phpStudy...相关推荐
- C语言 C++中的union用法总结(包懂)
开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这 ...
- 关于C语言编程中include的用法
关于C语言编程中include的用法 1 iostream与iostream.h的区别: #include <iostream.h> // 这个就是1998年标准化以后的标准头文件 #in ...
- c1语言水平要多久,对普通人来说,一般需要多长时间才能学会一门外语?
对普通人来说,一般需要多长时间才能学会一门外语? 外语学习,有人觉得容易,有人觉得难,总的来说,即使在互联网广泛普及,外语资料垂手可得的今天,外语学习对大多数人来讲,依然不是一件轻松的事,对许多正在学 ...
- c语言转义字符_C语言啊中的转义符有什么含义?
其实所谓的换行符就是回车,在各类编程语言中换行符是很常见的,而转义字符是一种特殊的字符常量.转义字符以反斜线""开头,后跟一个或几个字符. 转义字符具有特定的含义,不同于字符原有的 ...
- 职高计算机专业c语言_C语言在中职计算机专业课程中的重要作用探究
摘 要:在中职计算机教学中,C语言是计算机专业学生必备的基本技能之一,同时也是一门基础课程.C语言具有强大的功能和广泛的应用,在相关的科技领域中,已经日趋完善和发展.结合C语言的特点,进一步指出了C语 ...
- java中demo接人_return的用法_如何理解java中return的用法?
C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...
- 详解python中的用法_详解python中*号的用法
1.表示乘号 2.表示倍数,例如: def T(msg,time=1): print((msg+' ')*time) T('hi',3) 打印结果(打印3次): hi hi hi 3.单个 * (1) ...
- java SQLexists用法,mssql sql server where 中exists in 用法举例
摘要: 下文讲述where子句中,in exists用法举例 in exists 功能简介: in exists:查询数据存在于表中的关键字 in exists:查询效率上 exists效率高于in ...
- java finally用法_深入浅析java中finally的用法
finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下. 之前在写爬虫的时候数据 ...
最新文章
- C++/C++11中头文件numeric的使用
- 二分查找的循环实现和递归实现
- python的中文含义-python __all__ 含义
- Blog博客系统数据库设计
- Lazy FP状态还原漏洞公布,大多数Intel的酷睿CPU受其影响
- div高度、宽度100% div width、height 100%
- python实现文件上传和下载_[Python] socket实现TFTP上传和下载
- 10万人的大场馆如何“画座位”?
- 最全Pycharm教程
- 传授电脑蓝屏开不了机怎么办
- .NET的轻量级IOC框架芮双随笔
- python的本地包下载地址
- 2017.6.4 problem b 失败总结
- 如何在局域网上托管ASP.NET Web应用程序
- leetcode689:Maximum Sum of 3 Non-Overlapping Subarrays
- php小数乘法,三 小数乘法精品|小学数学,北师大版,四年级下册,数学精品下载_21精品_21世纪教育网...
- 【 Codeforces Round #552 (Div. 3) G】Minimum Possible LCM【埃氏筛】
- 括号里面一个上面一个数下面一个数符号怎么打?/ 概率论组合符号怎么打?
- fedora 19 安装中文语言包
- Python-GeoPandas地图、专题地图绘制