枚舉就是定義一個類別,而且窮舉統一類別下的個體以供代碼使用。c++
不管是具名枚舉的名字仍是枚舉類型中的成員,都是全局範圍的,其做用域是全局的。 若是在不一樣的枚舉中定義了相同的枚舉成員,則會出現重複聲明(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; }
你可能會想到使用命名空間來封裝枚舉類型,可是若是其中的某個命名空間漏寫了名字則會變成匿名空間,而匿名空間中的全部枚舉成員會默認變成全局命名空間下的成員。所以這種方法是不合適的。code
枚舉中的成員被設計爲常量數字的別名,所以能夠隱式的轉換爲 int
類型,可是這在某些時候是不被指望出現的。作用域
枚舉類型鎖佔用的空間大小以及符號不肯定。io
enum class enum_name: elem_type { elem1, elem2, ... };
強做用域,強類型枚舉成員的名稱不會被輸出到其父做用域空間。ast
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; // ok enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; // ok
轉換限制,強類型枚舉成員的值不能夠與整形隱式地相互轉換。class
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