列舉類型
- 只要將需要的變數值一一列舉出來,就構成了一個列舉類型。
- C++ 包含兩種列舉類型:不限定作用域的列舉類型和限定作用域的列舉類型(列舉類)。
- 不限定作用域的列舉類型聲明形式如下:
enum 列舉類型名 { 變數值列表 }; enum Weekday { SUN, MON, TUE, WED, THU, FRI, SAT };
不限定作用域的列舉類型說明
- 預設值:列舉元素按順序分配整數值,從
0
開始遞增。 - 自訂值:可以在聲明時另行指定列舉元素的值,如:
enum Weekday { SUN = 7, MON = 1, TUE, WED, THU, FRI, SAT };
- 操作:列舉值可以進行關係運算。
- 限制:列舉元素不能被賦值,且整數值不能直接賦給列舉變數,如需將整數賦值給列舉變數,應進行強制型別轉換。
例 4-9
- 設某次體育比賽的結果有四種可能:勝(WIN)、負(LOSE)、平局(TIE)、比賽取消(CANCEL)。編寫程式依序輸出這四種情況。
- 分析:由於比賽結果只有四種可能性,因此可以宣告一個列舉類型來存放比賽結果。
#include <iostream> using namespace std; enum GameResult { WIN, LOSE, TIE, CANCEL }; int main() { GameResult result; GameResult omit = CANCEL; for (int count = WIN; count <= CANCEL; count++) { result = GameResult(count); if (result == omit) cout << "The game was cancelled" << endl; else { cout << "The game was played "; if (result == WIN) cout << "and we won!"; if (result == LOSE) cout << "and we lost."; cout << endl; } } return 0; } 執行結果: The game was played and we won! The game was played and we lost. The game was played The game was cancelled
- 分析:由於比賽結果只有四種可能性,因此可以宣告一個列舉類型來存放比賽結果。
列舉類——強類型列舉
- 定義語法形式:
enum class 列舉類型名 : 底層型別 { 列舉值列表 };
- 範例:
enum class Type { General, Light, Medium, Heavy }; enum class Type : char { General, Light, Medium, Heavy }; enum class Category { General = 1, Pistol, MachineGun, Cannon };
列舉類的優勢
- 強作用域:其作用域限制在列舉類中。範例:使用 Type 的列舉值 General:
Type::General
- 轉換限制:列舉類物件不可與整型值隱式地互相轉換。
- 可指定底層型別:
- 範例:
enum class Type : char { General, Light, Medium, Heavy };
- 範例:
列舉類舉例
#include<iostream> using namespace std; enum class Side { Right, Left }; enum class Thing { Wrong, Right }; // 不衝突 int main() { Side s = Side::Right; Thing w = Thing::Wrong; // cout << (s == w) << endl; // 編譯錯誤,無法直接比較不同列舉類 return 0; }