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)<<'\t'<<endl;
  cout<<"u1各數據地址:\n"<<&u1<<'\t'<<&u1.d<<'\t'<<&u1.s<<'\t'<<&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 \n", word.v16);
  printf("word.v8[0] = %x \n", word.v8[0]);
  printf("word.v8[1] = %x \n", word.v8[1]);

  return 0;
}

union成員限制

1)union不能作為基類使用,所以成員函數不能為虛函數。
2)union不能具有靜態數據成員或引用成員
3)union自身可以有析構和構造,但不能具有定義了析構或構造的類成員
4)匿名聯合不能存在私有成員或保護成員,不能有成員函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM