C++中union的使用方法


1 概述

1.1 定義

union即為聯合,它是一種特殊的類。通過關鍵字union進行定義,一個union可以有多個數據成員。例如

  1.  
    union Token{
  2.  
    char cval;
  3.  
    int ival;
  4.  
    double dval;
  5.  
    };

 

以上代碼定義了一個名為Token的聯合,該聯合中包含了3個數據成員。

1.2 互斥賦值

在任意時刻,聯合中只能有一個數據成員可以有值。當給聯合中某個成員賦值之后,該聯合中的其它成員就變成未定義狀態了。

  1.  
    Token token;
  2.  
     
  3.  
    token.cval = 'a';
  4.  
     
  5.  
    token.ival = 1;
  6.  
     
  7.  
    token.dval = 2.5;

 

以上代碼定義了聯合Token的一個變量token,此時token所占內存的數據如圖1所示。

 

圖1 token所占內存數據

紅色方框內的數據即為token所占內存數據。因為token中長度最大的變量是double類型,所以token的長度是8個字節。

之后首先為token的變量cval賦值,此時token所占內存的數據如圖2所示。

 

圖2 token所占內存數據

此時,token所占內存的第一個字節的值變為0x61,即字符’a’。

接下來為token的變量ival賦值,此時token所占內存的數據如圖3所示。

 

圖3 token所占內存數據

此時,token所占內存的前四個字節變為0x00000001,即為數字1。在對token的ival賦值之后,cval的值就變為了0x01,實際上就沒有意義了。

最后,為token的變量dval賦值,此時token所占內存的數據如圖4所示。

 

圖4 token所占內存數據

此時,token所占內存的八個字節都有了相應的值。在對token的dval賦值之后,cval的值變為了0x00,而ivale的值變為了0x00000000,都沒有了實際意義,也就是之前提到的未定義狀態。

1.3 訪問權限

聯合可以為其成員指定public、protected和private等訪問權限,默認情況下,其成員的訪問權限為public。在“1.1 定義”中定義的聯合Token,其三個成員的訪問權限均為public。

2 為成員指定長度

在“1.2 互斥賦值”中提到,聯合的存儲空間至少能夠容納其最大的數據成員。也可以為聯合的成員指定長度。通過冒號操作符來實現成員長度的指定。

  1.  
    union U {
  2.  
     
  3.  
    unsigned short int aa;
  4.  
     
  5.  
    struct {
  6.  
     
  7.  
    unsigned int bb : 7;//(bit 0-6)
  8.  
     
  9.  
    unsigned int cc : 6;//(bit 7-12)
  10.  
     
  11.  
    unsigned int dd : 3;//(bit 13-15)
  12.  
     
  13.  
    };
  14.  
     
  15.  
    } u;

 

以上代碼定義了一個名為U的聯合,並且定義了U的變量u。聯合U包含兩個成員,一個是unsigned short int類型的變量,其大小為2個字節;另一個是一個自定義結構,該自定義結構中包含了3個unsigned int類型的變量。需要注意的是,每個unsigned int類型的變量的大小並不是默認的4個字節,而是通過冒號操作符指定了其大小,該大小的單位是比特。所以,聯合u的大小是2個字節。

之后,對聯合u中的aa進行賦值

u.aa = 0xE07F;

 

此時,聯合u所占的內存數據如圖5所示。

圖5 聯合u所占內存數據

此時,u.bb所處的位置是0-6比特;u.cc所處的位置是7-12比特;u.dd所處的位置是13-15比特,如圖6所示。

 

圖6 聯合u的結構

所以,此時u.bb的值是127;u.cc的值是0;u.dd的值是7。


免責聲明!

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



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