1. 程式人生 > 實用技巧 >enum class 和 enum比較

enum class 和 enum比較

兩種型別比較

/ 不限定作用域 限定作用域
作用域範圍 列舉成員和列舉型別作用域相同 列舉成員的名字遵循常規作用域準則
自動轉換 列舉型別或成員可以自動轉換成整形 不進行隱式轉換
預設型別 不存在 int
前置宣告 需要指定成員型別才可以宣告 可以用預設型別直接宣告
  • 一般來說大括號裡的內容屬於一個作用域,但在不限定作用域的列舉型別中,列舉成員的作用域是在列舉型別所屬作用域內,這樣就可能洩露名字
    enum Color {black, white};
    auto white = false; //錯誤,white已經在範圍內被聲明瞭。
  • 前置宣告的好處:
    降低編譯依賴性,如果列舉型別中的成員要增刪,可能整個系統都要重新編譯,即使程式只有一個地方使用了該列舉型別。

使用限定作用域範圍的列舉型別好處:

  1. 降低名字衝突。
  2. 更便捷的前置宣告。
  3. 列舉量是更強型別的,不能隱式轉換型別,程式碼更安全。

使用不限定作用域範圍的列舉型別好處:

  1. 因為列舉成員可以自動轉換成整數型別,在需要傳入整數的程式中可以直接寫列舉成員,可讀性高。

補充:

  1. 不限定作用域的列舉型別也可以前置宣告,但需要定義預設型別。
  2. 在需要傳入整數的函式中想用限定作用域範圍的列舉型別成員,可以顯示的將列舉成員轉換型別或者寫一個模板函式,傳入列舉成員,返回整數值。

定義

enum有名字就可以定義並初始化該型別的成員,只能用enum成員或者同類型enum物件來初始化。如果未命名,則只能在定義enum的時候定義物件。