19. struct,union和enum简单模拟variant
两个结构体赋值时,如果存在指针成员,这时候复制了指针的值,而不是指针目标的值,称为浅拷贝。函数调用传递结构体而不是结构体指针时,隐含浅拷贝,这点需要注意。
避免两个结构体中的指针成员引用同一资源的方法:
1.如果有条件,让每个结构体变量中的指针成员各自拥有独立的资源(深拷贝)。
2.引用计数,所有结构体变量中的指针成员同时引用同一资源,但记录引用情况,满足条件则真正处理该资源。
给union 中的成员赋值时,相当于获取union 变量的地址并强制转换成对应类型的指针,再往里写入数据。
union MyUnion {
char c;
int i;
float f;
double d;
};
MyUnion me;
me.c = 'A';
*(char *)&me = 'A';
me.i = 999;
*(int *)&me = 999;
me.f = 99.9f;
*(float *)&me = 99.9f;
me.d = 99.9;
*(double *)&me = 99.9;
枚举只能代替符号化整形宏。
变体的一种实现思路是,利用enum设置类型,union设置各种要包含的类型,并定义一组set/get函数,编译器配合不显示函数名的话,看起来就像:
a = 123;
a = 99.8;
a = 'A';
a = "Hello";