C++11中union的使用方法示例
前言
union即為聯(lián)合,它是一種特殊的類(lèi)。通過(guò)關(guān)鍵字union進(jìn)行定義,一個(gè)union可以有多個(gè)數(shù)據(jù)成員。例如
union Token{
char cval;
int ival;
double dval;
};
c++11中union除了繼承c語(yǔ)言的數(shù)據(jù)共享內(nèi)存之外,行為上越來(lái)越像一個(gè)類(lèi),比如成員默認(rèn)是public類(lèi)型。
在C++11以后,很多基礎(chǔ)語(yǔ)法都進(jìn)行了修正。其中 union 的行為向類(lèi)對(duì)象進(jìn)行了發(fā)展,在兼容原有語(yǔ)法定義的基礎(chǔ)上進(jìn)行了擴(kuò)充:
- union可以擁有成員函數(shù)(包含構(gòu)造函數(shù)和析構(gòu)函數(shù)),但是不能有虛函數(shù)
 - union不能參與繼承,不能成為基類(lèi)也不能成為子類(lèi)
 - union的成員對(duì)象不能為引用類(lèi)型
 
對(duì)于全部成員都是 build-in 的 union 類(lèi),還可以向以往一樣進(jìn)行使用:
#include <iostream>
#include <cstdint>
union S
{
 std::int32_t n;  // 占用4字節(jié)
 std::uint16_t s[2]; // 占用4字節(jié)
 std::uint8_t c;  // 占用1字節(jié)
};      // 整體占用4字節(jié)
 
int main()
{
 S s = {0x12345678}; // 初始化第一個(gè)成員,當(dāng)前s.n為活躍成員
 // 于此點(diǎn),讀取 s.s 或 s.c 是未定義行為
 std::cout << std::hex << "s.n = " << s.n << '\n';
 s.s[0] = 0x0011; // s.s 現(xiàn)在是活躍成員
 // 在此點(diǎn),讀取 s.n 或 s.c 是未定義行為
 std::cout << "s.c is now " << +s.c << '\n' // 11 or 00, 依賴(lài)平臺(tái)實(shí)現(xiàn)
    << "s.n is now " << s.n << '\n'; // 12340011 or 00115678
}
對(duì)于全部包含非 built-in 的 union 類(lèi),則:
- 如果非靜態(tài)(non-static)成員帶有非平凡的特殊(non-trivial special)成員函數(shù)(自定義的:復(fù)制/移動(dòng)構(gòu)造函數(shù),復(fù)制/移動(dòng)賦值函數(shù),析構(gòu)函數(shù)),則該 union 類(lèi)的默認(rèn)相關(guān)的復(fù)制/移動(dòng)構(gòu)造函數(shù)、復(fù)制/移動(dòng)賦值函數(shù)、析構(gòu)函數(shù)都會(huì)被刪除,如果需要的話(huà),要求用戶(hù)自己定義實(shí)現(xiàn),如果用戶(hù)沒(méi)有自己定義,則不能進(jìn)行相關(guān)的復(fù)制/移動(dòng)操作
 - 如果非靜態(tài)(non-static)成員帶有非平凡的特殊(non-trivial special)構(gòu)造函數(shù)(自定義的構(gòu)造函數(shù)),則該 union 類(lèi)的默認(rèn)構(gòu)造函數(shù)會(huì)被刪除,如果需要的話(huà),要求用戶(hù)自己定義實(shí)現(xiàn),如果用戶(hù)沒(méi)有自己定義,則不能該 union 類(lèi)不能進(jìn)行實(shí)例化。
 - 至多一個(gè)變體成員能擁有默認(rèn)成員初始化值
 - 不能有靜態(tài)成員數(shù)據(jù)(這個(gè)很奇怪,在clang上會(huì)報(bào)鏈接錯(cuò)誤而不是語(yǔ)法錯(cuò)誤),但是可以有靜態(tài)成員函數(shù)
 - 全部成員的訪問(wèn)控制都是 public
 
第1、2點(diǎn)的意思是,如果成員數(shù)據(jù)類(lèi)型是非平凡的(non-trivial),則 union 類(lèi)需要定義相關(guān)的構(gòu)造函數(shù)、復(fù)制函數(shù)、移動(dòng)構(gòu)造、移動(dòng)賦值函數(shù)、析構(gòu)函數(shù)等。
union A {
 int a;
 double b;
 std::string c;
 A() : c("111") {} // 因?yàn)閟td::string擁有是非平凡的的數(shù)據(jù)類(lèi)型,
 ~A() {}   // 則A必須自定義構(gòu)造函數(shù)和析構(gòu)函數(shù),否則無(wú)法進(jìn)行實(shí)例化
     // 如果想實(shí)現(xiàn)復(fù)制語(yǔ)義,還得自定義復(fù)制(構(gòu)造)函數(shù)
};
第3點(diǎn)的意思是:
union A {
 int a;
 double b;
 std::string c = "abc"; // 只有一個(gè)成員數(shù)據(jù)能擁有這種初始化值
 ~A(){};
};
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)我們的支持。
欄 目:C語(yǔ)言
下一篇:C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng)
本文標(biāo)題:C++11中union的使用方法示例
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/672.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
 - 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
 - 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
 - 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
 - 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
 - 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
 - 01-10APUE筆記之:進(jìn)程環(huán)境詳解
 - 01-10c++中inline的用法分析
 - 01-10如何尋找數(shù)組中的第二大數(shù)
 - 01-10C++大數(shù)模板(推薦)
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
 - 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
 - 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
 - 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
 - 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
 - 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
 - 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
 - 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
 - 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
 - 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 04-02jquery與jsp,用jquery
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-10C#中split用法實(shí)例總結(jié)
 


