C++11 強類型枚舉

枚舉就是定義一個類別,而且窮舉統一類別下的個體以供代碼使用。c++

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;
    }

    你可能會想到使用命名空間來封裝枚舉類型,可是若是其中的某個命名空間漏寫了名字則會變成匿名空間,而匿名空間中的全部枚舉成員會默認變成全局命名空間下的成員。所以這種方法是不合適的。code

  • 枚舉中的成員被設計爲常量數字的別名,所以能夠隱式的轉換爲 int 類型,可是這在某些時候是不被指望出現的。作用域

  • 枚舉類型鎖佔用的空間大小以及符號不肯定。io

C++11 中的強枚舉類型語法格式

enum class enum_name: elem_type { elem1, elem2, ... };

C++11 強枚舉類型的優勢

  • 強做用域,強類型枚舉成員的名稱不會被輸出到其父做用域空間。ast

    enum class PUBLIC_COLOR { RED, GREEN, BLACK };  // ok
    enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };   // ok
  • 轉換限制,強類型枚舉成員的值不能夠與整形隱式地相互轉換。class

    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
相關文章
相關標籤/搜索