1. 枚舉:分本別類和數值的名字
程序中需要“數值的名字”時,有三種方式實現:
(1)宏
#define Male 0
#define Female 1
(2)匿名的enum
enum { Male, Female };
(3)靜態常量
const static int Male = 0;
const static int Female = 1;
2. 有缺陷的枚舉
具名的enum類型的名字以及enum的成員的名字都是全局可見的。
以下會出錯:
#include <iostream> using namespace std; namespace T { enum TYPE { General, Light, Medium, Heavy }; } namespace { enum Category { General = 1, Pistol, MachineGun, Cannon }; } int main() { T::Type t = T::light; if (t == General) //忘記使用namespace cout << "General Weapon" << endl; return 0; }
另外,C++中枚舉被設計為常量數值的“別名”的本性,所以枚舉的成員總是可以被隱式地轉換為整形。
枚舉類型所占用的空間大小也是一個不確定量。
3. 強類型枚舉以及c++11對原有枚舉類型的擴展
聲明強類型枚舉,只需要在enum加上關鍵字class。
enum class Type { General, Light, Medium, Heavy };
優點:
(1)強作用域,強類型枚舉成員的名稱不會被輸出到其父作用域空間
(2)轉換限制,強類型枚舉成員的值不可以與整形隱式地相互轉換
(3)可以指定底層類型。強類型枚舉默認的底層類型為int,但也可以顯式地指定底層類型。
比如:
enum class Type: char { General, Light, Medium, Heavy };
#include <iostream> using namespace std; enum class Type { General, Light, Medium, Heavy }; enum class Category { General = 1, Pistol, MachineGun, Cannon }; int main() { Type t = Type::Light; t = General; //編譯失敗,必須使用強類型名稱 if (t == Category::General) //編譯失敗,必須使用Type中的General cout << "General Weapon" << endl; if (t > Type::General) //通過編譯 cout << "Not General Weapon" << endl; if (t > 0) //編譯失敗,無法轉換為int類型 cout << "Not General Weapon" << endl; if ((int)t > 0) //通過編譯 cout << "Not General Weapon" << endl; return 0; }