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 内部成员共用同一块内存

不可被继承

也不可继承

不可有虚函数

可以有成员函数

还可使用位域

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue+vite项目,无法使用绝对地址动态导入

博主的桌面工具软件已经正式开发&#xff0c;获取方式&#xff1a; 可以关注我的小程序【中二少年工具箱】获取。&#xff08;若小程序更新有延迟&#xff0c;可先收藏小程序&#xff09; 通过下载链接 百度网盘: 链接&#xff1a;https://pan.baidu.com/s/15zDnSoEzJGSZLjpD…

C语言之随心所欲打印三角形,金字塔,菱形(倒金字塔)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 三角形 金字塔 倒金字塔 菱形 三角形 题目&#xff1a;根据输入的行数打印对应的三角形。&#xff08;用 * 号打印&#xff09; #includ…

在windows平台上mysql的安装教程

1.下载 mysql下载网址&#xff1a;https://dev.mysql.com/downloads/installer/ 这里直接选择的是mysql的社区版。自己使用直接选择免费的就行 直接选择下载 2.安装过程 选择Server only 就行 下一步 下一步 下一步&#xff0c;选择弱密码把&#xff0c;方便学习和自己使用 设置…

蓝桥杯Web应用开发-浮动与定位

浮动与定位 浮动布局比较灵活&#xff0c;不易控制&#xff0c;而定位可以控制元素的过分灵活性&#xff0c;给元素一个具体的空间和精确的位置。 浮动 我们使用 float 属性指定元素沿其容器的左侧或右侧放置&#xff0c;浮动布局常见取值如下&#xff1a; • left&#xff0…

K8S之Namespace的介绍和使用

Namespace的理论和实操 Namespace理论说明Namespace实操创建、查看命名空间使用ResouceQuota 对Namespace做资源限额更多ResouceQuota 的使用 Namespace理论说明 命名空间定义 K8s支持多个虚拟集群&#xff0c;它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间&…

seatunnel数据集成(一)简介与安装

seatunnel数据集成&#xff08;一&#xff09;简介与安装seatunnel数据集成&#xff08;二&#xff09;数据同步seatunnel数据集成&#xff08;三&#xff09;多表同步seatunnel数据集成&#xff08;四&#xff09;连接器使用 1、背景 About Seatunnel | Apache SeaTunnel …

Docker下安装GitLab

极狐GitLab Docker 镜像 | 极狐GitLab 安装所需最小配置 内存至少4G 系统内核至少3.10以上 uname -r 命令可以查看系统内核版本 安装Docker 1.更新 yum源 yum update 2.安装依赖(如果在操作第三步的时候提示yum-config-manager 未找到命令 就安装下面依赖) yum instal…

R语言学习case11:ggplot 置信区间(包含多子图)

ggplot Geometric objects How are these two plots similar? 两个图都包含相同的x变量、相同的y变量&#xff0c;并且描述相同的数据。但是这两个图并不相同。每个图使用不同的可视化对象来表示数据。在ggplot2语法中&#xff0c;我们说它们使用不同的geoms。 geom是绘图…

使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队

作者&#xff1a;来自 Jessica Garson 大约一年前&#xff0c;我经历了一段压力很大的时期&#xff0c;最后参加了一场篮球比赛。 在整个过程中&#xff0c;我可以以一种我以前无法做到的方式断开连接并找到焦点。 我加入的第一支球队是波士顿凯尔特人队。 波士顿凯尔特人队是…

C语言实现memcpy、memmove库函数

目录 引言一、库函数介绍二、库函数详解三、源码实现1.memcpy源码实现2.memmove源码实现 四、测试1.memcpy函数2.memmove函数 五、源码1.memcpy源码2.memmove源码 六、参考文献 引言 关于memcpy和memmove这两个函数&#xff0c;不论是算法竞赛还是找工作面试笔试&#xff0c;对…

感悟笔记——2024年2月5日

今日阅读了一篇挺有深度的文章&#xff0c;主要阐述进入职场后的大部分人&#xff0c;是怎么逐渐沦为螺丝钉的?即使起点巨高的优等生&#xff0c;也不可避免。文章指路&#xff1a; 「优等生思维」正在将你变成「螺丝钉」和「老黄牛」从小到大&#xff0c;我一直都是那个「别…

Python类与对象

目录 面向对象 定义类 创建对象 类的成员 实例变量 构造方法 实例方法 类变量 类方法 封装性 私有变量 私有方法 使用属性 继承性 Python中的继承 多继承 方法重写 多态性 继承与多态 鸭子类型测试与多态 面向对象 类和对象都是面向对象中的重要概念。面向…

目标检测:3采用YOLOv8 API训练自己的模型

​ 目录 ​1.YOLOv8 的新特性 2.如何使用 YOLOv8? 3使用YOLOv8训练模型 4.验证训练集 5.测试训练集 6.测验其他图片 7 其他问题 参考: 1.YOLOv8 的新特性 Ultralytics 为 YOLO 模型发布了一个全新的存储库。它被构建为 用于训练对象检测、实例分割和图像分类模型的统…

【JS逆向学习】今日头条

逆向目标 目标网页&#xff1a;https://www.toutiao.com/?wid1707099375036目标接口&#xff1a;https://www.toutiao.com/api/pc/list/feed目标参数&#xff1a;_signature 逆向过程 老规矩先观察网络请求&#xff0c;过滤XHR请求观察加密参数&#xff0c;发现Payload的_s…

arm 汇编积累

C语言函数与汇编对应关系 一、MOV 系列指令 1、指令格式 MOV{条件}{S} 目的寄存器&#xff0c;源操作数 2、含义解析&#xff1a; &#xff08;1&#xff09;&#xff1a;mov 指令传送数据 案例&#xff1a; MOV R0,R1 ; R0 R1; MOV PC,R14 ;PC R14; MOV R0,R…

Kafka SASL_SSL双重认证

文章目录 1. 背景2. 环境3. 操作步骤3.1 生成SSL证书3.2 配置zookeeper认证3.3 配置kafka安全认证3.4 使用kafka客户端进行验证3.5 使用Java端代码进行认证 1. 背景 kafka提供了多种安全认证机制&#xff0c;主要分为SASL和SSL两大类。 SASL&#xff1a; 是一种身份验证机制&…

【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总

【NLP概念合集&#xff1a;一】预训练 Pre-Training&#xff0c;微调 Fine-Tuning 及其方法的概念区别 前言请看此正文预训练 Pre-Training无监督学习 unsupervised learning概念&#xff1a;标签PCA 主成分分析&#xff08;Principal Component Analysis&#xff09;降维算法L…

本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目

本地部署TeamCity 本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目部署环境配置 TeamCity 服务器 URLTeamCity 上 GitLab 的相关配置GitLab 链接配置SSH 配置项目构建配置创建项目配置构建步骤构建触发器结语本地部署TeamCity打包发布GitLab管理的.NET Fra…

市场复盘总结 20240205

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率低 50% 最常用…

Leetcode刷题笔记题解(C++):257. 二叉树的所有路径

思路&#xff1a;深度优先搜索 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…