C++11 強類型枚舉相關總結
枚舉就是定義一個類別,並且窮舉統一類別下的個體以供代碼使用。
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
以上就是C++11 強類型枚舉相關總結的詳細內容,更多關於C++11 強類型枚舉的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- C++ RTTI與4種類型轉換的深入理解
- 聊聊c++數組名稱和sizeof的問題
- 淺析C++中dynamic_cast和static_cast實例語法詳解
- C++ 強制類型轉換詳解
- C++學習之算術運算符使用詳解