C++11 強(qiáng)類型枚舉相關(guān)總結(jié)
枚舉就是定義一個(gè)類別,并且窮舉統(tǒng)一類別下的個(gè)體以供代碼使用。
C++98 枚舉存在的缺陷:
- 無論是具名枚舉的名字還是枚舉類型中的成員,都是全局范圍的,其作用域是全局的。 如果在不同的枚舉中定義了相同的枚舉成員,則會(huì)出現(xiàn)重復(fù)聲明(redeclaration)錯(cuò)誤。
enum PUBLIC_COLOR { RED, YELLOW, GREEN }; enum PRIVATE_COLOR { RED, BLACK, PURPLE }; // RED 重定義 enum PUBLIC_COLOR { WHITE, GRAY }; // PUBLIC_COLOR 重定義 int main() { int color = RED; cout << color << endl; }
你可能會(huì)想到使用命名空間來封裝枚舉類型,但是如果其中的某個(gè)命名空間漏寫了名字則會(huì)變成匿名空間,而匿名空間中的所有枚舉成員會(huì)默認(rèn)變成全局命名空間下的成員。因此這種方法是不合適的。
- 枚舉中的成員被設(shè)計(jì)為常量數(shù)字的別名,因此可以隱式的轉(zhuǎn)換為 int 類型,但是這在某些時(shí)候是不被期望出現(xiàn)的。
- 枚舉類型鎖占用的空間大小以及符號(hào)不確定。
C++11 中的強(qiáng)枚舉類型語法格式
enum class enum_name: elem_type { elem1, elem2, ... };
C++11 強(qiáng)枚舉類型的優(yōu)點(diǎn)
- 強(qiáng)作用域,強(qiáng)類型枚舉成員的名稱不會(huì)被輸出到其父作用域空間。
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; // ok enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; // ok
- 轉(zhuǎn)換限制,強(qiáng)類型枚舉成員的值不可以與整形隱式地相互轉(zhuǎn)換。
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; if (PUBLIC_COLOR::GREEN == 1) { // errror: 未定義可接受的類型轉(zhuǎn)換 cout << "color1 == 1" << endl; } if (PRIVATE_COLOR::PURPLE == 1) { // ok cout << "color2 == 1" << endl; }
- 可以指定底層類型。強(qiáng)類型枚舉默認(rèn)的底層類型為 int,但也可以顯式地指定底層類型。
enum class PUBLIC_COLOR: char { RED, GREEN, BLACK }; enum PRIVATE_COLOR: int { RED, PURPLE, PINK }; cout << sizeof(PUBLIC_COLOR::GREEN) << endl; // 1 cout << sizeof(PRIVATE_COLOR::PURPLE) << endl; // 4
- 不可能對(duì)不同的枚舉類型的枚舉值進(jìn)行比較。但相同枚舉值之間如果指定的值相同,那么可以進(jìn)行比較。
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; if (PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE) { // errror cout << "PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE" << endl; } if (PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK) { // ok cout << "PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK" << endl; }
- 如果想要輸出枚舉值可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換
enum class PUBLIC_COLOR: char { RED, GREEN, BLACK }; enum PRIVATE_COLOR: int { RED, PURPLE, PINK }; cout << static_cast<int>(PUBLIC_COLOR::RED) << endl; // 0 cout << static_cast<int>(PRIVATE_COLOR::PURPLE) << endl; // 1
以上就是C++11 強(qiáng)類型枚舉相關(guān)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C++11 強(qiáng)類型枚舉的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++算法實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格數(shù)目
這篇文章為大家主要介紹了C++實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格的數(shù)目題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08C++中 STL list詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了C++中 STL list詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04C++實(shí)現(xiàn)LeetCode(203.移除鏈表元素)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(203.移除鏈表元素),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C語言一看就懂的選擇與循環(huán)語句及函數(shù)介紹
函數(shù)是一個(gè)功能模塊,它把實(shí)現(xiàn)某個(gè)功能的代碼塊包含起來,并起一個(gè)函數(shù)名,供別人調(diào)用,如printf函數(shù),如system函數(shù)。是程序運(yùn)行當(dāng)中包裝起來的一個(gè)步驟;選擇與循環(huán)是編程中最常用的結(jié)構(gòu),本篇文章用最簡(jiǎn)單的文字帶你了解它們2022-04-04VC++實(shí)現(xiàn)程序開機(jī)啟動(dòng)運(yùn)行的方法
這篇文章主要介紹了VC++實(shí)現(xiàn)程序開機(jī)啟動(dòng)運(yùn)行的方法,很實(shí)用的功能,需要的朋友可以參考下2014-08-08vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦)
這篇文章主要介紹了vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10C++?opencv圖像處理實(shí)現(xiàn)圖像腐蝕和膨脹示例
這篇文章主要為大家介紹了C++?opencv圖像處理實(shí)現(xiàn)圖像腐蝕和圖像膨脹示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05