C++ 做用域內枚舉

——傳統的枚舉存在一些問題,其中之一是兩個枚舉類型定義中的枚舉量可能發生衝突。安全

enum egg {Small, Medium, Large, Jumbo};
enum t_shirt {Small, Medium, Large, Xlarge};

  這將沒法經過編譯(egg Small和t_shirt Small發生衝突)blog

解決辦法(新枚舉):

C++11提供了一種新枚舉,其枚舉量的做用域爲類:ci

enum class egg {Small, Medium, Large, Jumbo};
eum class t_shirt {Small, Medium, Large, Xlarge};
  • 可以使用關鍵字struct代替class
  • 使用時需使用枚舉名來限定枚舉量:
    egg choice = egg::Large;    // the Large enumerator of the egg enum
    t_shirt Floyd = t_shirt::Large;    // the Large enumerator of the t_shirt enum
    
  • C++11提升了做用域內枚舉的類型安全:
    • 有時,常規枚舉將自動轉換爲整型,如將其賦給int變量或用於比較表達式時,但做用域內枚舉不能隱式地轉換爲整型:
      enum egg_old {Small, Medium, Large, Jumbo};    // unscoped
      enum class t_shirt {Small, Medium, Large, Xlarge};    // scoped
      egg_old one = Medium;    // unscoped
      t_shirt rolf = t_shirt::Large;    // scoped
      int king = one;    // implicit type conversion ofr unscoped
      int ring = rolf;    // not allowed, no implicit type conversion
      if (king < Jumbo)    // allowed
          std::cout<<"Jumbo converted to int before comparison.\n";
      if (king < t_shirt::Medium)    // not allowed
          std::cout<<"Not allowed: < not defined for scoped enum.\n";
      

        但在必要時,可顯示類型轉換:作用域

      int Frodo = int(t_shirt::Small);    // Frodo set to 0
      
相關文章
相關標籤/搜索