C++11中強(qiáng)類型枚舉的使用
1.C/C++98中的枚舉的缺陷
枚舉在C語言中是狠古老的類型,它分為匿名枚舉和具名枚舉,如果是匿名枚舉,那么它的用法只有一種:
//方法一: enum {Male,Female}; //方法二: #define Male 0 #define Female 1 //方法三: static const int Male=0; static const int Female=1;
如上三種方法實(shí)現(xiàn)的效果是差不多的,不過采用宏方法會(huì)引起一些不必要的糾紛。方法一和方法三在實(shí)現(xiàn)效果上幾乎完全一致,方法一和方法三等價(jià)替換。
對(duì)于具名枚舉來說,一般用法就是聲明一個(gè)變量是枚舉類型的,然后該變量只能由枚舉成員初始化和賦值
enum Gender{Male,Female}; Gender a=Male; a=Female; a=1;//錯(cuò)誤
C/C++98中的枚舉的缺陷主要是三個(gè):
- 對(duì)全局名稱空間的污染
- 枚舉成員(或變量)可以隱式轉(zhuǎn)化為整型
- 枚舉成員(或變量)的底層類型,即整型由編譯器決定
在C++11中,我們引入了名稱空間的概念,我們同樣希望枚舉成員能夠采用名字::成員的方式進(jìn)行訪問,而不是直接將大量的枚舉成員暴露在當(dāng)前名稱空間中。
此外.我們更希望枚舉類型獨(dú)立于整型,或者說,至少它不應(yīng)該自動(dòng)轉(zhuǎn)化為整型,例如下面這樣。
enum Gender{Male,Female}; Gender a=Male; int b=a; int c=Female;
我們看最后一個(gè)缺陷,即枚舉成員(或變量)的底層類型一般是整型,但是不同的編譯器的設(shè)定不同,有可能一些是有符號(hào)整型,而另一種就是無符號(hào)整型。
enum Gender{Male=-1000,Female=9999};//這段代碼可能在某些編譯器中報(bào)錯(cuò)
2.強(qiáng)類型枚舉的使用
強(qiáng)類型枚舉(strong-typed enum)或者稱之為枚舉類,主要是針對(duì)上述三個(gè)缺陷進(jìn)行了修補(bǔ)。
#include<iostream> using namespace std; enum class Type {General,Light,Medium,Heavy}; enum struct Category{General=1,Pistol,MachineGun,Cannon}; int main() { ? ? Type t=Type::Light; ? ? t=General;//編譯錯(cuò)誤 ? ? if(t==Category::General)//編譯錯(cuò)誤 ? ? ? ? cout<<"A"<<endl; ? ? if(t> Type::General)//編譯通過 ? ? ? ? cout<<"B"<<endl; ? ? if(t>0)//編譯錯(cuò)誤 ? ? ? ? cout<<"C"<<endl; ? ? cout<<is_pod<Type>::value<<endl;//1 ? ? cout<<is_pod<Category>::value<<endl; }
我們總結(jié)出
- 強(qiáng)類型枚舉中的成員,只能采用名字::成員的方式進(jìn)行訪問
- 強(qiáng)類型枚舉類型的變量,只能和同是強(qiáng)類型枚舉的值進(jìn)行比較
- 強(qiáng)類型枚舉中的class關(guān)鍵詞,可以用struct進(jìn)行等價(jià)替換
#include<iostream> using namespace std; enum class C: char{C1=1,C2=2}; enum class D: unsigned int {D1=1,D2=2,Dbig=0xfffffff0u}; int main() { cout<<sizeof(C::C1)<<endl; cout<<(unsigned int)D::Dbig<<endl; cout<<sizeof(D::D1)<<endl; cout<<sizeof(D::Dbig)<<endl; }
而且我們?cè)诼暶鲝?qiáng)類型枚舉的同時(shí),可以顯式定義它的底層類型,enum class C: char,為了通用性,C++11也對(duì)C風(fēng)格枚舉進(jìn)行了這個(gè)優(yōu)化,即允許C風(fēng)格枚舉規(guī)定底層類型.
實(shí)際上,強(qiáng)類型枚舉也存在匿名類型,不過如果它是匿名的,你就無法訪問它的枚舉成員了,不過你可以使用decltype來找到名稱,不過也是多此一舉的,所以匿名強(qiáng)類型枚舉沒啥用。
到此這篇關(guān)于C++11中強(qiáng)類型枚舉的使用的文章就介紹到這了,更多相關(guān)C++11 強(qiáng)類型枚舉內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言函數(shù)的遞歸和調(diào)用實(shí)例分析
一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層2013-07-07C++實(shí)現(xiàn)簡單職工管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++職工管理系統(tǒng)實(shí)訓(xùn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04C語言實(shí)現(xiàn)經(jīng)典小游戲井字棋的示例代碼
這個(gè)三子棋游戲是在學(xué)習(xí)C語言的過程中自己編寫的一個(gè)小游戲,現(xiàn)在將自己的思路(主要以流程圖形式和代碼中的注釋表達(dá))和具體代碼以及運(yùn)行結(jié)果分享出來以供大家學(xué)習(xí)參考,希望對(duì)大家有所幫助2022-11-11