天天看點

C++11 Enum枚舉使用心得C++11 Enum使用心得

轉載:https://blog.csdn.net/lxhw1018/article/details/83217703

C++11 Enum使用心得

定義

和類類似,枚舉定義了一種新的自定義類型,其将一組整形常量組織在一起。枚舉屬于字面值常量類型。

使用

在使用枚舉時,需要注意以下兩個方面:

  1. 根據作用域區分,枚舉分為限定作用域(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實作限定作用域的枚舉類型轉換。

  1. 指定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
};
           

繼續閱讀