天天看點

c++ enum 給定類型_C++11作用域内枚舉enum

在C++11之前的枚舉(enum),是沒有辦法兩個枚舉(enum)内有相同枚舉名的。如果還不知道C++中枚舉(enum)是什麼,可以看這篇:枚舉enum

如:蘋果和桔子都有大,中,小。寫個代碼來說明下:

兩枚舉類型中相同枚舉值

C++

1

2

enumapple{big,medium,small,special};

enumorange{big,medium,small};

以上代碼編譯不會通過的,因為apple和orange在同一個作用域内。之前我們可能會改成用size來做枚舉,但apple枚舉又多了一個枚舉值,這樣在C++11之前版本中就不會很好處理。

哪C++11是如何處理這類問題?

C++11提供一種新枚舉(enum),其枚舉量的作用域為類。

具體聲明如下:

C++11作用域内枚舉

C++

1

2

enumclassapple{big,medium,small,special};

enumclassorange{big,medium,small};

聲明中的class關鍵字,也可以用struct。

C++11作用域内枚舉struct

C++

1

2

enumstructapple{big,medium,small,special};

enumstructorange{big,medium,small};

這樣枚舉的作用域為類後,不同枚舉(enum)定義中的枚舉量就不會有名稱沖突。

如何使用作用域内枚舉?

使用枚舉名來限定枚舉量,這樣編譯器才會明白用哪個的枚舉量。

使用C++11作用域内枚舉量

C++

1

2

applea1=apple::big;

orangeo1=orange::big;

C++11作用域内枚舉不能預設隐式轉換成int

C++

1

2

3

4

5

6

7

//C++ 98

inti=a1;//正确

//C++ 11

intj=o1;//錯誤

intk=int(o1);//顯示類型轉換

上面代碼可以看出C++11代碼會更加安全,如一定要轉換,必需顯示類型轉換。

為什麼不能直接轉換具體原因?

C++98中,枚舉類的具體值類型是什麼,可能随系統而異,沒有硬規定。但一般都會是int類型。

C++11中,枚舉類的具體值類型不在依賴系統,可以自己定義。如不指定,預設C++11作用域内枚舉的值類型是int。

如何指定C++11作用域内枚舉的值類型?

指定枚舉值類型定義文法:

C++11指定枚舉值類型定義

C++

1

2

enumclass:shortapple{big,medium,small,special};//值類型為short

enumclass:intorange{big,medium,small};/值類型為int

相關文章:自定義類型枚舉enum枚舉enum沒有新定義類型,結構是一個新類型這點可以從它們的定義看到,枚舉的每個值沒有類型,隻有名字,結束用“,”結構類的成員都有自己的類型,有變量名,結束用“;”。其時枚舉enum是整型變量,枚舉enum的定義意義,就是以Arrow類型為例,它的取值隻有4個,主要還是為了程式設計時友善管理,友善閱讀,友善了解程式。運用有非常多,如顔色枚舉、季節枚舉、月份枚舉、星期枚舉等等。...

C++11語言auto關鍵字作用C++11中對關鍵字auto進行了重新定義,可以讓編譯器根據初始值類型自動推斷變量的類型。auto a  = 0;   //推斷出a類型為int atuo b = 0.0;  //推斷出b類型doublu auto c = 'A';  //推斷出c類型是char如果不知道為什麼能自動推斷出來可以看下:常量類型     和   C++常量類型 擷取上面寫的都是推斷基本類型,當然C++11 auto關鍵字并非隻樣簡單的運用,更多的是為了自定義類型推斷。相信很多人在寫疊代器時會很頭痛,太長了。先個vector類型的疊代器。...

C++11新增數組初始化方式C++11之前數組使用方法可以參考這篇:數組使用注意點今天這篇主要講C++11數組新增加初始化方式。 1.C++11數組初始化時可省略等号 2.C++11數組初始化時大括号内可以不包含任何東西 3.C++11數組初始化時不能縮窄轉換。縮窄轉換:就是寬類型轉窄類型,例如double轉int ...

C++11字元串新增初始化方式C++11除了支援之前版本的初始化方式外,還支援清單初始化方式。清單初始化可以看上篇:C++11新增數組初始化方式下面寫個新增初始化方式和之前指派方式比較:...

C++都支援哪些作用域C++語言作用域符号是兩個冒号:: ,相信大家不陌生,在看代碼是一定會有很多地方有這::符号。作用域,如果不了解是什麼,可以先了解成起作用的範圍。書上都是寫作用域,這樣比較書面話,如寫成作用範圍就不哪麼好聽。C++語言支援3種作用域: 1.局部作用域(local scope) 2.名字空間作用域(namespace scope)   3.類作用域(class scope) ...

C++11新增模闆類array原因vector類的功能比數組強大,但效率沒有數組高(vector對象配置設定在自由存儲區或堆中)。效率來講内置數組是最高的,但是會不安全不友善,如下标越界、兩個數組指派要用for循環一個個指派。以上兩點,C++11中就新增了array類模闆,來解決内置數組不安全不友善,相比vector提高效率(array對象配置設定在棧中)。...

C++11新增基于範圍的for循環之前在用for循環時,每次都要寫條件,并不是很方法。double a[5] = {1,2,3,4,5}; for(int i=0;i...

C++11關鍵字decltype用途關鍵字decltype将變量的類型聲明為表達式指定的類型。下面的語句的含義是,讓y的類型與x相同,其中x是一個表達式。decltype (x) y;decltype的工作原理比auto複雜,可以指定類型為引用和const。...

C++11新增關鍵字nullptrnullptr關鍵字就是表示空指針的意思,C++11之前空指針都是NULL。已經有了NULL哪為什麼還要有nullptr關鍵字? nullptr表示空指針,不能轉換為整型類型。為了向後相容,C++11仍允許用0(NULL)來表示空指針。建議使用nullptr而不是0(NULL),因為更高的類型安全。...

C++11兩個尖括号中間可以不用加空格在之前寫C++代碼時,比如聲明嵌套模闆(vector裡面存的還是vector),這時就會有兩個尖括号出現。就會與運算符>>搞混,C++要求在聲明嵌套模闆時使用空格将尖括号分開。...