C++中關(guān)于union的使用方法說明
1 概述
1.1 定義
union即為聯(lián)合,它是一種特殊的類。通過關(guān)鍵字union進行定義,一個union可以有多個數(shù)據(jù)成員。
例如:
union Token{
char cval;
int ival;
double dval;
};以上代碼定義了一個名為Token的聯(lián)合,該聯(lián)合中包含了3個數(shù)據(jù)成員。
1.2 互斥賦值
在任意時刻,聯(lián)合中只能有一個數(shù)據(jù)成員可以有值。
當給聯(lián)合中某個成員賦值之后,該聯(lián)合中的其它成員就變成未定義狀態(tài)了。
Token token; token.cval = 'a'; token.ival = 1; token.dval = 2.5;
以上代碼定義了聯(lián)合Token的一個變量token,此時token所占內(nèi)存的數(shù)據(jù)如圖1所示。

圖1 token所占內(nèi)存數(shù)據(jù)
紅色方框內(nèi)的數(shù)據(jù)即為token所占內(nèi)存數(shù)據(jù)。因為token中長度最大的變量是double類型,所以token的長度是8個字節(jié)。
之后首先為token的變量cval賦值,此時token所占內(nèi)存的數(shù)據(jù)如圖2所示。

圖2 token所占內(nèi)存數(shù)據(jù)
此時,token所占內(nèi)存的第一個字節(jié)的值變?yōu)?x61,即字符’a’。
接下來為token的變量ival賦值,此時token所占內(nèi)存的數(shù)據(jù)如圖3所示。

圖3 token所占內(nèi)存數(shù)據(jù)
此時,token所占內(nèi)存的前四個字節(jié)變?yōu)?x00000001,即為數(shù)字1。在對token的ival賦值之后,cval的值就變?yōu)榱?x01,實際上就沒有意義了。
最后,為token的變量dval賦值,此時token所占內(nèi)存的數(shù)據(jù)如圖4所示。

圖4 token所占內(nèi)存數(shù)據(jù)
此時,token所占內(nèi)存的八個字節(jié)都有了相應的值。在對token的dval賦值之后,cval的值變?yōu)榱?x00,而ivale的值變?yōu)榱?x00000000,都沒有了實際意義,也就是之前提到的未定義狀態(tài)。
1.3 訪問權(quán)限
聯(lián)合可以為其成員指定public、protected和private等訪問權(quán)限,默認情況下,其成員的訪問權(quán)限為public。在“1.1 定義”中定義的聯(lián)合Token,其三個成員的訪問權(quán)限均為public。
2 為成員指定長度
在“1.2 互斥賦值”中提到,聯(lián)合的存儲空間至少能夠容納其最大的數(shù)據(jù)成員。
也可以為聯(lián)合的成員指定長度。
通過冒號操作符來實現(xiàn)成員長度的指定。
union U {
unsigned short int aa;
struct {
unsigned int bb : 7;//(bit 0-6)
unsigned int cc : 6;//(bit 7-12)
unsigned int dd : 3;//(bit 13-15)
};
} u;以上代碼定義了一個名為U的聯(lián)合,并且定義了U的變量u。
聯(lián)合U包含兩個成員,一個是unsigned short int類型的變量,其大小為2個字節(jié);另一個是一個自定義結(jié)構(gòu),該自定義結(jié)構(gòu)中包含了3個unsigned int類型的變量。
需要注意的是,每個unsigned int類型的變量的大小并不是默認的4個字節(jié),而是通過冒號操作符指定了其大小,該大小的單位是比特。所以,聯(lián)合u的大小是2個字節(jié)。
之后,對聯(lián)合u中的aa進行賦值
u.aa = 0xE07F;
此時,聯(lián)合u所占的內(nèi)存數(shù)據(jù)如圖5所示。

圖5 聯(lián)合u所占內(nèi)存數(shù)據(jù)
此時,u.bb所處的位置是0-6比特;u.cc所處的位置是7-12比特;u.dd所處的位置是13-15比特,如圖6所示。

圖6 聯(lián)合u的結(jié)構(gòu)
所以,此時u.bb的值是127;u.cc的值是0;u.dd的值是7。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C++編程中多級派生時的構(gòu)造函數(shù)和訪問屬性
這篇文章主要介紹了詳解C++編程中多級派生時的構(gòu)造函數(shù)和訪問屬性,是C++入門學習中的基礎知識,需要的朋友可以參考下2015-09-09
數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實例代碼
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
C++在成員函數(shù)中使用STL的find_if函數(shù)實例
這篇文章主要介紹了C++在成員函數(shù)中使用STL的find_if函數(shù)實例,包括了STL中find_if函數(shù)的具體用法及相關(guān)的完整實例,非常具有參考借鑒價值,需要的朋友可以參考下2014-10-10
C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)快速排序圖文示例
這篇文章主要為大家介紹了C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)快速排序圖文示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

