• C++/C union使用记一下锅


    //首先,学习编程一定要记得加几个群或者加几个讨论组,因为这样你才能不断地进步还有吵架/滑稽

    记一下 关于使用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的总结也就到这儿了吧,写的有点乱,如果有哪位博友看到问题或者其他排版问题  /*欢迎评论和私聊*/

  • 相关阅读:
    Java 插入排序
    Java 浮点型与双精度数值比较
    Java 包装类Integer的值比较
    ORA-00942 table or view does not exist
    logging模块
    面向对象
    模块和包
    异常处理
    序列化模块
    css3选择器
  • 原文地址:https://www.cnblogs.com/jijiboy/p/9966289.html
Copyright © 2020-2023  润新知