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)匿名联合不能存在私有成员或保护成员,不能有成员函数

原文地址:https://www.cnblogs.com/xiongyungang/p/12029155.html