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.hqwc.cn/news/454961.html

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

相关文章

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

【产品升级】SmartPipe升级到版本2.0

在近一个月的攻关和测试下&#xff0c;SmartPipe软件轴线自动识别算法的性能大幅提升&#xff0c;鲁棒性和稳定性进一步增强。近一年来客户累计反馈的多种复杂管路&#xff08;包括带有支管管路、带有压瘪段管路、推弯管、装配管、带有复杂孔洞管路等&#xff09;现在均能够正确…

离散数学——图论(笔记及思维导图)

离散数学——图论&#xff08;笔记及思维导图&#xff09; 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰

Antd+React+react-resizable实现表格拖拽功能

1、先看效果 2、环境准备 "dependencies": {"antd": "^5.4.0","react-resizable": "^3.0.4",},"devDependencies": {"types/react": "^18.0.33","types/react-resizable": "^…

Excel——高级筛选匹配条件提取数据

一、筛选多条件 Q&#xff1a;筛选多个条件&#xff0c;并将筛选出的内容复制到其他区域 点击任意一个单元格 点击【数据】——【筛选】——【高级筛选】 选择【将筛选结果复制到其他位置】——在【列表区域】 鼠标选择对应的区域位置&#xff0c;条件区域一定要单独写出来&a…

JVM 性能调优 - Java 虚拟机内存体系(1)

Java 虚拟机我们简称为 JVM&#xff08;Java Virtual Machine&#xff09;。 Java 虚拟机在执行 Java 程序的过程中&#xff0c;会管理几个不同的数据区域。如下图所示&#xff1a; 下面我会介绍这几个数据区的特点。 堆 堆区的几个特点&#xff1a; 线程共享。启动时创建堆…

L1-009 N个数求和-java

输入样例1&#xff1a; 5 2/5 4/15 1/30 -2/60 8/3输出样例1&#xff1a; 3 1/3输入样例2&#xff1a; 2 4/3 2/3输出样例2&#xff1a; 2输入样例3&#xff1a; 3 1/3 -1/6 1/8输出样例3&#xff1a; 7/24 这是使用递归的另一种计算最大公约数的方法。 如果 b 为0&#…

【从0上手Cornerstone3D】如何使用CornerstoneTools中的工具之同步器

同步器&#xff08;Synchronizers&#xff09;可以使多个视图同步响应同一个工具的操作&#xff0c;例如我们在MPR视图下&#xff0c;同步操作三个视图的缩放程度、windowLevel等等 一个同步器必须需要以下几个部分才可以执行 一个监听事件&#xff08;什么情况下触发同步&…

3D力导向树插件-3d-force-graph学习001

一、引入文件&#xff1a;下载静态js文件引入 1、**以vue项目测试&#xff0c;在index.html文件中引入静态文件&#xff08;js文件可在官网下载&#xff09;** 2、**也曾尝试用npm包下载引入的方法&#xff0c;总是会有报错&#xff0c;所以采用静态js文件引入的方式** 二、基…

浅析软件测试中的一些常见理论:杀虫剂效应、金字塔模型、缺陷集群性原则、软件测试活动依赖于软件测试背景、软件测试的7大基本原则

这篇文章我主要想记录学习一下在软件测试行业中的一些常见理论效应以做基本了解。 一、杀虫剂效应 1、杀虫剂效应介绍 杀虫剂效应原本指农业中随着农药的普及使用&#xff0c;害虫对农药的抗药性就越来越强&#xff0c;农药就越来越难杀死害虫。在农场里为了对付破坏农作物的…

PyTorch 2.2 中文官方教程(九)

在生产环境中部署 PyTorch 模型 通过 Flask 在 Python 中部署 PyTorch 的 REST API 原文&#xff1a;pytorch.org/tutorials/intermediate/flask_rest_api_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整的示例代码 作者&#…

程序员为什么不喜欢关电脑,这回答很霸道!

在大家的生活中&#xff0c;经常会发现这样一个现象&#xff1a;程序员经常不关电脑。 至于程序员不关电脑的原因&#xff0c;众说纷纭。 其中这样的一个程序员&#xff0c;他的回答很霸道&#xff1a; “因为我是程序员&#xff0c;我有权选择不关电脑。我需要在任何时候都能够…