轉載:https://blog.csdn.net/lxhw1018/article/details/83217703
C++11 Enum使用心得
定義
和類類似,枚舉定義了一種新的自定義類型,其将一組整形常量組織在一起。枚舉屬于字面值常量類型。
使用
在使用枚舉時,需要注意以下兩個方面:
- 根據作用域區分,枚舉分為限定作用域(C++11引入)和不限定作用域兩種,定義如下:
enum class DAY // 限定作用域
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY
};
enum MONTH // 不限定作用域
{
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
};
- 成員是const,是以建議用定義枚舉成員用大寫。
預設情況下,枚舉值從0開始,依次加1。其好處就是在不指定專門值的情況下,枚舉值基本不存在重複值,便于代碼的維護。若某些值超過枚舉類型所能容納的範圍,編譯會産生warning警告,需注意。
在《Effective Modern C++》中,Scott Meyers建議優先使用限定作用域的枚舉類型,而非限定作用域的枚舉類型。原因主要有以下兩個方面:
a. 限定作用域的枚舉類型将名字空間污染降低,如下:
auto day = SUNDAY; // SUNDAY被限定在DAY作用域内
auto day = DAY::SUNDAY; // OK
auto month = JANUARY; // OK
b. 限定作用域的枚舉類型是強型别的,限定作用域的枚舉類型無法通過隐式轉換到其他類型,而不限定的枚舉類型可以自動轉換為整形。
int num = DAY::SUNDAY; // 限定作用域的枚舉類型不會進行隐式轉換
int num = MONTH::JANUARY; // OK
當然,可以使用強制類型轉換static_cast實作限定作用域的枚舉類型轉換。
- 指定enum的大小
在enum中,我們可以指定enum的大小,進而優化記憶體。盡管每個enum都定義了自己唯一的類型,但是實際上enum是由某種整數類型表示的,進而來存儲值。在C++11中,可以在enum的名字後面指定我們想該enum使用的類型,如下:
enum class DAY : uint8_t // 限定作用域
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY
};
當然,一旦某個枚舉類型超過了該類型所能容納的範圍,編譯會錯誤,若忽略會導緻程式錯誤。
enum class DAY : uint8_t // 限定作用域
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY,
SATURDAY = 255,
SUNDAY // 枚舉值為256,但由于超過類型所能容納的大小,值為0
};