最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++11強(qiáng)類(lèi)型枚舉

 更新時(shí)間:2020年08月14日 16:37:34   作者:Dabelv  
這篇文章主要介紹了C++11強(qiáng)類(lèi)型枚舉的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++11,感興趣的朋友可以了解下

1.傳統(tǒng)枚舉類(lèi)型的缺陷

枚舉類(lèi)型是C/C++中用戶(hù)自定義的構(gòu)造類(lèi)型,它是由用戶(hù)定義的若干枚舉常量的集合。枚舉值對(duì)應(yīng)整型數(shù)值,默認(rèn)從0開(kāi)始。比如定義一個(gè)描述性別的枚舉類(lèi)型。

enum Gender{Male,Female};

其中枚舉值Male被編譯器默認(rèn)賦值為0,F(xiàn)emale賦值為1。傳統(tǒng)枚舉類(lèi)型在設(shè)計(jì)上會(huì)存在以下幾個(gè)問(wèn)題。

(1)同作用域同名枚舉值會(huì)報(bào)重定義錯(cuò)誤。傳統(tǒng)C++中枚舉常量被暴漏在同一層作用域中,如果同一作用域下有兩個(gè)不同的枚舉類(lèi)型,但含有同名的枚舉常量也是會(huì)報(bào)編譯錯(cuò)誤的,比如:

enum Fruits{Apple,Tomato,Orange};
enum Vegetables{Cucumber,Tomato,Pepper}; //編譯報(bào)Tomato重定義錯(cuò)誤

其中水果和蔬菜兩個(gè)枚舉類(lèi)型中包含同名的Tomato枚舉常量會(huì)導(dǎo)致編譯錯(cuò)誤。因?yàn)閑num則是非強(qiáng)作用域類(lèi)型,枚舉常量可以直接訪(fǎng)問(wèn),這種訪(fǎng)問(wèn)方式與C++中具名的namespace、class/struct以及union必須通過(guò)"名字::成員名"的訪(fǎng)問(wèn)方式大相徑庭。

(2)由于枚舉類(lèi)型被設(shè)計(jì)為常量數(shù)值的“別名”,所以枚舉常量總是可以被隱式轉(zhuǎn)換為整型,且用戶(hù)無(wú)法為枚舉常量定義類(lèi)型。

(3)枚舉常量占用存儲(chǔ)空間以及符號(hào)性不確定。C++標(biāo)準(zhǔn)規(guī)定C++枚舉所基于的“基礎(chǔ)類(lèi)型”是由編譯器來(lái)具體實(shí)現(xiàn),這會(huì)導(dǎo)致枚舉類(lèi)型成員的基本類(lèi)型存在不確定性問(wèn)題,尤其是符號(hào)性問(wèn)題,即??疾烊缦率纠?/p>

enum A{A1=1,A2=2,ABig=0xFFFFFFFFU};
enum B{B1=1,B2=2,BBig=0xFFFFFFFFFUL};

int main()
{
	cout<<sizeof(A1)<<endl;	//4
	cout<<ABig<<endl;		//4294967295
	cout<<sizeof(B1)<<endl;	//8
	cout<<BBig<<endl;		//68719476735
}

以上輸出結(jié)果是在Linux平臺(tái)下使用g++編譯輸出的結(jié)果,在VC++(VS2017)中的輸出結(jié)果分別是4、-1、4和-1??梢?jiàn)不同編譯器對(duì)枚舉常量的整型類(lèi)型的寬度和符號(hào)有著不同的實(shí)現(xiàn)。GNU C++會(huì)根據(jù)枚舉數(shù)值的類(lèi)型使用不同寬度和符號(hào)的整型,VC++則始終以有符號(hào)int來(lái)表示枚舉常量。

為了解決以上傳統(tǒng)枚舉類(lèi)型的缺陷,C++11引入了強(qiáng)類(lèi)型枚舉解決了這些問(wèn)題。

2.強(qiáng)類(lèi)型枚舉

非強(qiáng)作用域類(lèi)型,允許隱式轉(zhuǎn)換為整型,枚舉常量占用存儲(chǔ)空間以及符號(hào)性的不確定,都是枚舉類(lèi)缺點(diǎn)。針對(duì)這些缺點(diǎn),C++11引入了一種新的枚舉類(lèi)型——強(qiáng)類(lèi)型枚舉(strong-typed enum)。

強(qiáng)類(lèi)型枚舉使用enum class語(yǔ)法來(lái)聲明:

enum class Enumeration{VAL1,VAL2,VAL3=100,VAL4};

強(qiáng)類(lèi)型枚舉具有如下幾個(gè)優(yōu)點(diǎn):
(1)強(qiáng)作用域,強(qiáng)類(lèi)型枚舉成員的名稱(chēng)不會(huì)被輸出到其父作用域,所以不同枚舉類(lèi)型定義同名枚舉成員編譯不會(huì)報(bào)重定義錯(cuò)誤。進(jìn)而使用枚舉類(lèi)型的枚舉成員時(shí),必須指明所屬范圍,比如Enum::VAL1,而單獨(dú)的VAL1則不再具有意義;
(2)轉(zhuǎn)換限制,強(qiáng)類(lèi)型枚舉成員的值不可以與整型發(fā)生隱式相互轉(zhuǎn)換。比如比如Enumeration::VAL4==10;會(huì)觸發(fā)編譯錯(cuò)誤;
(3)可以指定底層類(lèi)型。強(qiáng)類(lèi)型枚舉默認(rèn)的底層類(lèi)型是int,但也可以顯示地指定底層類(lèi)型。具體方法是在枚舉名稱(chēng)后面加上":type",其中type可以是除wchar_t以外的任何整型。比如:

enum class Type:char{Low,Middle,High};

注意:
(1)聲明強(qiáng)類(lèi)型枚舉的時(shí)候,既可以使用關(guān)鍵字enum class,也可以使用enum struct。事實(shí)上,enum struct與enum class在語(yǔ)法上沒(méi)有任何區(qū)別。
(2)由于強(qiáng)類(lèi)型枚舉是強(qiáng)類(lèi)型作用域的,故匿名的enum class可能什么都做不了,如下代碼會(huì)報(bào)編譯錯(cuò)誤:

enum class{General,Light,Medium,Heavy}weapon;
int main()
{
weapon=Medium; //編譯出錯(cuò)
bool b=weapon == weapon::Medium; //編譯出錯(cuò)
return 0;
}

當(dāng)然對(duì)于匿名強(qiáng)類(lèi)型枚舉我們還是可以使用decltype來(lái)獲得其類(lèi)型并進(jìn)而使用,但是這樣做可能違背強(qiáng)類(lèi)型枚舉進(jìn)行匿名的初衷。

3.C++11對(duì)傳統(tǒng)枚舉類(lèi)型的擴(kuò)展

傳統(tǒng)枚舉類(lèi)型為了配合C++11引入的強(qiáng)類(lèi)型枚舉,C++11對(duì)傳統(tǒng)枚舉類(lèi)型進(jìn)行了擴(kuò)展。
(1)底層的基本類(lèi)型可以在枚舉名稱(chēng)后加上":type",其中type可以是除wchar_t以外的任何整型,比如:

enum Type:char{Low,Middle,High};

(2)C++11中,枚舉類(lèi)型的成員可以在枚舉類(lèi)型的作用域內(nèi)有效。比如:

enum Type{Low, Middle, High };
Type type1 = Middle;
Type type2 = Type::Middle;

其中Middle與Type::Middle都是合法的使用形式。

以上就是詳解C++11強(qiáng)類(lèi)型枚舉的詳細(xì)內(nèi)容,更多關(guān)于c++ 枚舉的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++棧(stack)的模板類(lèi)實(shí)現(xiàn)代碼

    C++棧(stack)的模板類(lèi)實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C++棧(stack)的模板類(lèi)實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 使用Qt生成Word和PDF文檔的詳細(xì)教程

    使用Qt生成Word和PDF文檔的詳細(xì)教程

    Qt 是一個(gè)跨平臺(tái)的應(yīng)用程序開(kāi)發(fā)框架,除了用于創(chuàng)建圖形界面應(yīng)用程序外,還可以用來(lái)生成 Word 和 PDF 文檔,本文將介紹如何使用 Qt 來(lái)生成Word和PDF文檔,以及相關(guān)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • C++實(shí)現(xiàn)貪心算法的示例詳解

    C++實(shí)現(xiàn)貪心算法的示例詳解

    這篇文章主要通過(guò)幾個(gè)試題為大家詳細(xì)介紹了C++中貪心算法的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)貪心算法有一定的幫助,需要的可以參考一下
    2022-07-07
  • C語(yǔ)言版三子棋小游戲

    C語(yǔ)言版三子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++之openFrameworks框架介紹

    C++之openFrameworks框架介紹

    本章我們將介紹一個(gè)非常好用的跨平臺(tái)的 C++開(kāi)源框架 openFrameworks。它是一個(gè)開(kāi)源的跨平臺(tái)的C++工具包,方便開(kāi)發(fā)者創(chuàng)建出一個(gè)更簡(jiǎn)單和直觀(guān)的框架,擅長(zhǎng)開(kāi)發(fā)圖像和動(dòng)畫(huà),感興趣的同學(xué)可以參考一下
    2023-05-05
  • C語(yǔ)言進(jìn)階可變參數(shù)列表

    C語(yǔ)言進(jìn)階可變參數(shù)列表

    這篇文章主要為大家介紹了C語(yǔ)言進(jìn)階可變參數(shù)列表的示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • c++11中的noexcept關(guān)鍵字

    c++11中的noexcept關(guān)鍵字

    這篇文章主要介紹了c++11中的noexcept關(guān)鍵字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 利用Matlab制作三子棋游戲的示例代碼

    利用Matlab制作三子棋游戲的示例代碼

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線(xiàn)連起來(lái),相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線(xiàn),對(duì)方就算輸了。本文將用Matlab制作這一經(jīng)典游戲,感興趣的可以試一試
    2022-03-03
  • Qt+GDAL庫(kù)實(shí)現(xiàn)制作經(jīng)緯度坐標(biāo)轉(zhuǎn)換工具

    Qt+GDAL庫(kù)實(shí)現(xiàn)制作經(jīng)緯度坐標(biāo)轉(zhuǎn)換工具

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt和GDAL庫(kù)實(shí)現(xiàn)制作經(jīng)緯度坐標(biāo)轉(zhuǎn)換工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • C語(yǔ)言智能指針之weak_ptr淺析

    C語(yǔ)言智能指針之weak_ptr淺析

    這篇文章主要介紹了 C++11智能指針之weak_ptr詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

博罗县| 惠水县| 苍南县| 丰镇市| 吉安县| 临澧县| 哈巴河县| 宣化县| 双牌县| 临朐县| 万载县| 遂昌县| 山阴县| 岳池县| 象山县| 嘉荫县| 望江县| 紫阳县| 项城市| 通城县| 出国| 藁城市| 泸溪县| 朔州市| 灵宝市| 江华| 泰宁县| 丁青县| 东乌珠穆沁旗| 浦县| 文登市| 黔西| 集贤县| 四川省| 九龙城区| 永春县| 临澧县| 镇雄县| 武威市| 蒙城县| 界首市|