列舉就是定義一個類別,并且窮舉統一類別下的個體以供代碼使用,
C++98 列舉存在的缺陷:
-
無論是具名列舉的名字還是列舉型別中的成員,都是全域范圍的,其作用域是全域的, 如果在不同的列舉中定義了相同的列舉成員,則會出現重復宣告(redeclaration)錯誤,
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; }你可能會想到使用命名空間來封裝列舉型別,但是如果其中的某個命名空間漏寫了名字則會變成匿名空間,而匿名空間中的所有列舉成員會默認變成全域命名空間下的成員,因此這種方法是不合適的,
-
列舉中的成員被設計為常量數字的別名,因此可以隱式的轉換為
int型別,但是這在某些時候是不被期望出現的, -
列舉型別鎖占用的空間大小以及符號不確定,
C++11 中的強列舉型別語法格式
enum class enum_name: elem_type { elem1, elem2, ... };
C++11 強列舉型別的優點
-
強作用域,強型別列舉成員的名稱不會被輸出到其父作用域空間,
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; // ok enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; // ok -
轉換限制,強型別列舉成員的值不可以與整形隱式地相互轉換,
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; if (PUBLIC_COLOR::GREEN == 1) { // errror: 未定義可接受的型別轉換 cout << "color1 == 1" << endl; } if (PRIVATE_COLOR::PURPLE == 1) { // ok cout << "color2 == 1" << endl; } -
可以指定底層型別,強型別列舉默認的底層型別為
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 -
不可能對不同的列舉型別的列舉值進行比較,但相同列舉值之間如果指定的值相同,那么可以進行比較,
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; } -
如果想要輸出列舉值可以進行強制型別轉換
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264043.html
標籤:C++
上一篇:關于Scanner重復輸入的問題
下一篇:現代C++之右值語意
