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;
如上三種方法實現(xiàn)的效果是差不多的,不過采用宏方法會引起一些不必要的糾紛。方法一和方法三在實現(xiàn)效果上幾乎完全一致,方法一和方法三等價替換。
對于具名枚舉來說,一般用法就是聲明一個變量是枚舉類型的,然后該變量只能由枚舉成員初始化和賦值
enum Gender{Male,Female}; Gender a=Male; a=Female; a=1;//錯誤
C/C++98中的枚舉的缺陷主要是三個:
- 對全局名稱空間的污染
- 枚舉成員(或變量)可以隱式轉(zhuǎn)化為整型
- 枚舉成員(或變量)的底層類型,即整型由編譯器決定
在C++11中,我們引入了名稱空間的概念,我們同樣希望枚舉成員能夠采用名字::成員的方式進(jìn)行訪問,而不是直接將大量的枚舉成員暴露在當(dāng)前名稱空間中。
此外.我們更希望枚舉類型獨立于整型,或者說,至少它不應(yīng)該自動轉(zhuǎn)化為整型,例如下面這樣。
enum Gender{Male,Female}; Gender a=Male; int b=a; int c=Female;
我們看最后一個缺陷,即枚舉成員(或變量)的底層類型一般是整型,但是不同的編譯器的設(shè)定不同,有可能一些是有符號整型,而另一種就是無符號整型。
enum Gender{Male=-1000,Female=9999};//這段代碼可能在某些編譯器中報錯
2.強(qiáng)類型枚舉的使用
強(qiáng)類型枚舉(strong-typed enum)或者稱之為枚舉類,主要是針對上述三個缺陷進(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;//編譯錯誤 ? ? if(t==Category::General)//編譯錯誤 ? ? ? ? cout<<"A"<<endl; ? ? if(t> Type::General)//編譯通過 ? ? ? ? cout<<"B"<<endl; ? ? if(t>0)//編譯錯誤 ? ? ? ? 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)行等價替換
#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; }
而且我們在聲明強(qiáng)類型枚舉的同時,可以顯式定義它的底層類型,enum class C: char,為了通用性,C++11也對C風(fēng)格枚舉進(jìn)行了這個優(yōu)化,即允許C風(fēng)格枚舉規(guī)定底層類型.
實際上,強(qiáng)類型枚舉也存在匿名類型,不過如果它是匿名的,你就無法訪問它的枚舉成員了,不過你可以使用decltype來找到名稱,不過也是多此一舉的,所以匿名強(qiáng)類型枚舉沒啥用。
到此這篇關(guān)于C++11中強(qiáng)類型枚舉的使用的文章就介紹到這了,更多相關(guān)C++11 強(qiáng)類型枚舉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實現(xiàn)經(jīng)典小游戲井字棋的示例代碼
這個三子棋游戲是在學(xué)習(xí)C語言的過程中自己編寫的一個小游戲,現(xiàn)在將自己的思路(主要以流程圖形式和代碼中的注釋表達(dá))和具體代碼以及運行結(jié)果分享出來以供大家學(xué)習(xí)參考,希望對大家有所幫助2022-11-11