之前我们说了一些 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 内部成员共用同一块内存
不可被继承
也不可继承
不可有虚函数
可以有成员函数
还可使用位域