c++11 強類型枚舉


1. 枚舉:分本別類和數值的名字

程序中需要“數值的名字”時,有三種方式實現:

(1)宏

#define Male 0

#define Female 1

(2)匿名的enum

enum { Male, Female };

(3)靜態常量

const static int Male = 0;

const static int Female = 1;

2. 有缺陷的枚舉

具名的enum類型的名字以及enum的成員的名字都是全局可見的。

以下會出錯:

#include <iostream>
using namespace std;

namespace T {
  enum TYPE { General, Light, Medium, Heavy };
}

namespace {
  enum Category { General = 1, Pistol, MachineGun, Cannon };
}

int main() {
  T::Type t = T::light;
  if (t == General)  //忘記使用namespace
    cout << "General Weapon" << endl;

  return 0;
}

另外,C++中枚舉被設計為常量數值的“別名”的本性,所以枚舉的成員總是可以被隱式地轉換為整形。

枚舉類型所占用的空間大小也是一個不確定量。

3. 強類型枚舉以及c++11對原有枚舉類型的擴展

聲明強類型枚舉,只需要在enum加上關鍵字class。

enum class Type { General, Light, Medium, Heavy };

優點:

(1)強作用域,強類型枚舉成員的名稱不會被輸出到其父作用域空間

(2)轉換限制,強類型枚舉成員的值不可以與整形隱式地相互轉換

(3)可以指定底層類型。強類型枚舉默認的底層類型為int,但也可以顯式地指定底層類型。

比如:

enum class Type: char { General, Light, Medium, Heavy };

#include <iostream>
using namespace std;

enum class Type { General, Light, Medium, Heavy };
enum class Category { General = 1, Pistol, MachineGun, Cannon };

int main() {
  Type t = Type::Light;
  t = General;  //編譯失敗,必須使用強類型名稱

  if (t == Category::General) //編譯失敗,必須使用Type中的General
    cout << "General Weapon" << endl;
  if (t > Type::General) //通過編譯
    cout << "Not General Weapon" << endl;
  if (t > 0)  //編譯失敗,無法轉換為int類型
    cout << "Not General Weapon" << endl;
  if ((int)t > 0)  //通過編譯
    cout << "Not General Weapon" << endl;

  return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM