弱類型枚舉(weakly typed enum)
一開始,由于C++的枚舉類型來源于C惭聂,所以出于設計簡單的目的圾叼,枚舉類型只用來表示整型常量的一些名字榨惠。
語法:
enum Gender {
MALE,
FEMALE
};
這里MALE和FEMALE就是枚舉值憾赁,由于枚舉默認從0開始污朽,并且后一位枚舉值自動增加1,所以數(shù)值上就分別表示0和1龙考。
但是弱類型枚舉有幾個缺點蟆肆,一是枚舉值沒有限定作用域(unscoped)矾睦,就是說同一作用域下兩種枚舉類型的同名枚舉值會產生沖突:
enum Cup {
SMALL
};
//重復定義SMALL,編譯出錯
enum Size {
SMALL
};
//本來顯示指明Cup::SMALL或者Size::SMALL是沒有歧義的炎功,但誰讓最初設定可以不帶類型使用枚舉值枚冗,所以還沒編譯到這句,定義沖突就直接over了
Cup cup = SMALL;
二是枚舉值可以隱式轉換為整型變量蛇损,當然這一設定也是不好的:
enum Number {
ZERO
};
//正常編譯
int n = ZERO;
強類型枚舉(strongly typed enum)
為了修復以上缺陷赁温,C++11引入了新的強類型枚舉,只需要在枚舉類型名前面加上class關鍵字即可淤齐,和弱類型枚舉類型語法不沖突:
enum class Gender {
MALE,
FEMALE
};
//強類型枚舉使用時必須指定屬于哪一種枚舉類型
Gender gender = Gender::MALE;
//轉換為整型變量股囊,必須使用顯示轉換
int n = static_cast<int>(Gender::MALE);
除此之外,強類型枚舉還可以指定底層整型類型(若沒有指定則默認為int床玻,而弱類型枚舉沒有默認類型):
enum class Gender : long {
MALE,
FEMALE
};
所以以后寫代碼還是盡量用新的強類型枚舉吧毁涉。