之前我们说了一些 struct 结构体
现在来了解新的自定义类型 union 联合体
语法
union ptr
{
void* fptr;
CLassFunPtr p;
FunPtr p2;
ptr& operator=(CLassFunPtr ptr)
{
p = ptr;
return *this;
}
ptr& operator=(FunPtr Fptr)
{
p服务器托管网2 = 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( 0x0987654321);
opObj.fptr = reinterpret_cast(0x0987654321);
printf("union fptr: %p ", u1Obj.fptr);
printf("struct fptr: %p n", opObj.fptr);
u1Obj.o = 0xFFFFFFFF;
o服务器托管网pObj.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( 0x0987654321);
opObj.fptr = reinterpret_cast(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.fwqtg.net
前言 本文主要是【算法】——蓝桥杯练习题(七)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 作者简介:大家好,我是听风与他 ☁️博客首页:CSDN主页服务器托管网听风与他 每日一句:狠狠沉淀,顶峰相见 目录 前言 1658.不同子串 605.年号字串 10…