当前位置: 首页 > news >正文

c++之说_10|自定义类型 union 联合体

之前我们说了一些 struct 结构体

现在来了解新的自定义类型  union 联合体

语法

union ptr
{void* fptr;CLassFunPtr p;FunPtr p2;ptr& operator=(CLassFunPtr ptr){p = ptr;return *this;}ptr& operator=(FunPtr Fptr){p2 = Fptr;return *this;}
} FunPtr_;

我们看到了  和  struct 定义上几乎一模一样

也是

union 类型名 {  内部成员  }  定义时实例的对象;

和 struct 最大区别就是

union内部的成员变量的内存都是共用同一块的  大小一般是  内部成员最大的那个个

比如

union u1
{void* fptr;float c;int o;char b;} u1Obj;struct op
{void* fptr;float c;int o;char b;
} opObj;printf("union大小: %d  ",sizeof(u1Obj));printf("struct大小: %d  ", sizeof(opObj));

看到没  union 内存大小是 8 struct的内存大小是:24  同样的内部成员

union共享同一个内存块

给你们看看区分

u1Obj.fptr = reinterpret_cast<void*>( 0x0987654321);
opObj.fptr = reinterpret_cast<void*>(0x0987654321);printf("union fptr: %p   ", u1Obj.fptr);
printf("struct fptr: %p   \n", opObj.fptr);u1Obj.o = 0xFFFFFFFF;
opObj.o = 0xFFFFFFFF;printf("union fptr: %p   ", u1Obj.fptr);
printf("struct fptr: %p   \n", opObj.fptr);

输出横看每组

 至于 reinterpret_cast 这个是c++推荐的类型转换 关键字

但是我不太会用  也就 dynamic_cast 用来转换子父类指针会点

先不管这些  我们看看 内存

注意前四行

左边是union的   右边是 struct的

我们可以发现 union   u1Obj.o = 0xFFFFFFFFFF;  是直接写在了第一行 写了四个字节

而 struct opObj.o = 0xFFFFFFFF;  是直接写在了第三行 写了四个字节

发现没有?

还有一点   u1Obj.o = 0xFFFFFFFFFF; 给的数值是5个字节的却只写了四个字节

因为 o 这个变量是 int 型的  大小就是4字节  超出的就截掉了

union是不可以继承的  也不可被继承

在这里注意 我们使用了struct (结构体)继承了一个 class(类)

无法继承 自然也就没有必要有虚函数  

所以也不能有虚函数 但是可以有成员函数

注意到没 每个成员都是从低地址处开始算的  (要分大小端系统)

还记不记得我们之前在struct所说的 位域?

union里面也可以使用

看到没  截取了只写入了1字节  而8位正好是一字节

完整测试代码

union u2
{void* fptr;float c;int o;char b;};
union u1
{void* fptr;float c;int o:8;char b;char	getb(){return b;}} u1Obj;
class p
{
public:int ocp = 100;
};struct op 
{void* fptr;float c;int o;char b;
} opObj;printf("union大小: %d  ",sizeof(u1Obj));printf("struct大小: %d  \n", sizeof(opObj));u1Obj.fptr = reinterpret_cast<void*>( 0x0987654321);
opObj.fptr = reinterpret_cast<void*>(0x0987654321);printf("union fptr: %p   ", u1Obj.fptr);
printf("struct fptr: %p   \n", opObj.fptr);u1Obj.o = 0xFFFFFFFFFF;//10个F 5个字节  16进制是两个数为一个字节
opObj.o = 0xFFFFFFFF;printf("union fptr: %p   ", u1Obj.fptr);
printf("struct fptr: %p   \n", opObj.fptr);u1Obj.b = 'p';
printf("union getb(): %c   ",  u1Obj.getb() );

总结:

union 内部成员共用同一块内存

不可被继承

也不可继承

不可有虚函数

可以有成员函数

还可使用位域

相关文章:

  • 霍金《时间简史》(A Brief History of Time)学习笔记(第四章)
  • FastAdmin
  • Gateway反向代理配置
  • 浅聊一下redis的雪崩,穿透和击穿
  • 练习题解(关于最小生成树)
  • ASP.NET Core 预防开放式重定向攻击
  • 网易和腾讯面试题精选---性能和优化面试问题
  • MySQL 表的增删查改(练习)
  • 百家cms代审
  • 用C语言实现单个网页图片爬虫
  • [UI5 常用控件] 08.Wizard,NavContainer
  • 《幻兽帕鲁》攻略:0基础入门及游戏基础操作 幻兽帕鲁基础设施 幻兽帕鲁基础攻击力 Mac苹果电脑玩幻兽帕鲁 幻兽帕鲁加班加点
  • 【教程】微服务使用Feign接口进行远程调用的步骤
  • latex algorithm algorithmic Undefined control sequence
  • 【原创 附源码】Flutter海外登录--Google登录最详细流程
  • css属性的继承、初识值、计算值、当前值、应用值
  • flutter的key在widget list的作用以及必要性
  • KMP算法及优化
  • Magento 1.x 中文订单打印乱码
  • SpiderData 2019年2月13日 DApp数据排行榜
  • underscore源码剖析之整体架构
  • 经典排序算法及其 Java 实现
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 容器服务kubernetes弹性伸缩高级用法
  • 首页查询功能的一次实现过程
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 原生 js 实现移动端 Touch 滑动反弹
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $.ajax,axios,fetch三种ajax请求的区别
  • (a /b)*c的值
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (ros//EnvironmentVariables)ros环境变量
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (四)JPA - JQPL 实现增删改查
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)nsfocus-绿盟科技笔试题目
  • (转)创业家杂志:UCWEB天使第一步
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET Framework杂记
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 托管代码与非托管代码
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .net专家(高海东的专栏)
  • .project文件
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @Valid和@NotNull字段校验使用
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [383] 赎金信 js
  • [ASP]青辰网络考试管理系统NES X3.5
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [CF]Codeforces Round #551 (Div. 2)