//首先,学习编程一定要记得加几个群或者加几个讨论组,因为这样你才能不断地进步还有吵架/滑稽
记一下 关于使用union结构体时遇到的一些坑
To zero-initialize an object of type T means: — if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T; — if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized; — if T is a union type, the object’s first named data member89) is zero-initialized; — if T is an array type, each element is zero-initialized; — if T is a reference type, no initialization is performed. To default-initialize an object of type T means: — if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor); — if T is an array type, each element is default-initialized; — otherwise, the object is zero-initialized.
//这是C++标准里的截取的一小片段,加粗放大的那一句。
然后我就臆想了呀,关于如果声明一个局部变量union,第一个数据缺省初始化为 ”zero“(我感觉这么写比较好
但是万万没想到啊,用起来,union object zero initalize如果union object为全局变量,的确是结构体中的第一个变量为zero,但是,如果为局部变量的化就不一定了《编译器不同,数据也不同
也就是说标准给的这个不包括局部变量(block);
union 里面的元素默认为public类型,union没有constructor function 和 destructor function,因为这两个函数被delete。可以自己定义《鄙人认为现在的条件如果用到面向对象了,应该不会在乎这点内存吧,当然如果对象特别大的话《那我也不会union,我可以用指针啊,如果你说,我这个结构体中的几个变量,每次用的时候都会给初值,并且用的次数不多,那你用union吧,我反正不用。
//这就是构造和析构函数
union MYUNION{ char avs[100]; char s[2]; MYUNION(){ strcpy(avs,"abs"); } ~MYUNION(){ } }a;
还是我在标准中标粗的那句话,第一个就是第一个,你别想着大的为零,下面看代码
union MYUNION{ char avs[100]; char s[2]; }a;
//这个 第一行初始为zero 也就是说他的一百个char 全是zero,后面的两个也是zero
//然后 换一下
union MYUNION{
char avs[2];
char s[100];
}a;
//这样就是第一行的两个字节被声明了zero,如果输后面的98个就不是zero了
这是一个比较坑的地方要注意。
在数据结构教程第五版 p184 页有提到过,广义表的实现也用到了union这个结构体《只能有一种存在,是这一种,另一种就不是了,这就说了我如果有一个对象,他有两个特性,一个是a,一个是b,我用了a就不能用b,用了b就不能用a,我还想省下一些内存。这样我可以将他封进class/struct中
typedef struct lnode{ int tag; union{ int data; struct lnode *sublist; }val; struct lnode *link; }GYB;
union的总结也就到这儿了吧,写的有点乱,如果有哪位博友看到问题或者其他排版问题 /*欢迎评论和私聊*/