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

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.kler.cn/a/229444.html

相关文章:

  • 如何在 Linux、MacOS 以及 Windows 中打开控制面板
  • Xcode 正则表达式实现查找替换
  • 【大数据】机器学习-----线性模型
  • 【Docker】保姆级 docker 容器部署 MySQL 及 Navicat 远程连接
  • 基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台
  • 如何提高自动化测试覆盖率和效率
  • 艺术创作和生活的关系
  • 基于亚马逊云科技新功能:Amazon SageMaker Canvas无代码机器学习—以构建货物的交付状态检测模型实战为例深度剖析以突显其特性
  • Qt 字符串类应用与常用基本数据类型
  • MySQL知识点总结(四)——MVCC
  • 【力扣】罗马数字转整数,哈希集合+模拟
  • Git版本管理工具(基础):这一篇基本能满足Git基本的使用需求了!
  • WiFi 6 和WiFi 6e 的核心要点
  • 谷歌免费开放模糊测试框架OSS-Fuzz(物联网、车联网、供应链安全、C/C++)
  • clickhouse计算前后两点间经纬度距离
  • C++结构化绑定
  • GEDepth:Ground Embedding for Monocular Depth Estimation
  • 函数的连续与间断【高数笔记】
  • CAEX 学习记录
  • MATLAB语音去噪系统
  • docker自定义镜像并使用
  • Node.js+Express+Mysql服务添加环境变量
  • git 的基本概念
  • KY114 Coincidence
  • Unity接入GVoice腾讯实时语音
  • 【安卓跨程序共享数据,探究ContentProvider】