zoukankan      html  css  js  c++  java
  • c++中使用联合体

    定义:联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但是任何时刻,只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的

    union U1
    {
      int n;
      char s[11];
      double d;
    };
    

    联合体的大小

    1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除

    union U1
    {
      int n;
      char s[11];
      double d;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      U1 u1;
      // 对于U1联合体,s占11字节,n占4字节,d占8字节,因此其至少需1字节的空间。然而其实际大小并不是11,用运算符sizeof测试其大小为16。这是因为这里存在字节对齐的问题,11既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了
      cout<<sizeof(u1)<<'	'<<endl;
      cout<<"u1各数据地址:
    "<<&u1<<'	'<<&u1.d<<'	'<<&u1.s<<'	'<<&u1.n<<endl;
    
      return 0;
    }
    

    匿名联合

    class MCDValue
    {
    public:
      //  匿名联合作用域在外围对象,可直接使用外围对象访问联合成员变量
      //  匿名联合不能存在私有成员或保护成员,不能有成员函数
      union
      {
        std::string *pStr;
        int    num1;
        std::wstring *pWstr;
        double num2;  
      };
    };
    

    union判别式

    class Token
    {
    public:
        //  给union对象的某个数据成员赋值其他数据成员会变为未定义的
        //  避免错误访问到其他成员,添加一个单独的对象跟踪
        enum TokenKind {INT1, CHAR1, DBL1};
        TokenKind tok;
        union TokenValue
        {
            char cval;
            int ival;
            double dval;
        }val;
    };
    

    联合体存储高低位

    union Word
    {
      __int16 v16;
      __int8  v8[2];
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      Word word;
      word.v16 = 0x1122;
    
      printf("word.v16 = %x 
    ", word.v16);
      printf("word.v8[0] = %x 
    ", word.v8[0]);
      printf("word.v8[1] = %x 
    ", word.v8[1]);
    
      return 0;
    }
    

    union成员限制

    1)union不能作为基类使用,所以成员函数不能为虚函数。
    2)union不能具有静态数据成员或引用成员
    3)union自身可以有析构和构造,但不能具有定义了析构或构造的类成员
    4)匿名联合不能存在私有成员或保护成员,不能有成员函数

  • 相关阅读:
    乾颐堂7月HCIE、CCIE通过名单
    乾颐堂7月HCIE、CCIE通过名单
    乾颐堂7月HCIE、CCIE通过名单
    乾颐堂7月HCIE、CCIE通过名单
    Java实现文件压缩与解压[zip格式,gzip格式]
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/xiongyungang/p/12029155.html
Copyright © 2011-2022 走看看