C++ enum列舉用法攻略(超詳細)

2020-07-16 10:04:38
C++ 允許程式設計師建立自己的資料型別,比如本節要將的列舉型別。列舉資料型別是一種由程式設計師定義的資料型別,其合法值是與它們關聯的一組命名整數常數。

之所以被稱為列舉型別,就是因為命名常數是作為資料型別定義的一部分而列舉或列出的,以下是列舉型別宣告的範例:

enum Roster {Tom, Sharon, Bill, Teresa, John};

該語句將建立一個名為 Roster 的資料型別。因為單詞 enum 是 C++ 關鍵字,所以它必須小寫,值得注意的是,資料型別本身的名字是以大寫字母開頭的。雖然這並非必須,但是絕大多數程式設計師都會釆用首字母大寫的形式。

和 Roster 資料型別關聯的命名整數常數被稱為列舉量,Roster 資料型別的變數可能只是關聯到這些列舉量的值之一,但它們的值是什麼呢?

預設情況下,編譯器設定第一個列舉量為 0,下一個為 1,以此類推。在上述範例中,Tom 的值將是 0,Sharon 的值為 1,等等。最後一個列舉量 John 的值為 4。

重要的是要意識到,enum 語句範例實際上並沒有建立任何變數,只是定義資料型別。當以後建立這個資料型別的變數時,它們看起來就是整數,並且這些整數的值被限制在與列舉集合中的符號名稱相關聯的整數上。以下語句顯示了如何定義 Roster 資料型別的變數:

Roster student;

此語句的形式與其他任何變數定義一樣,首先是資料型別名稱,然後是變數名稱。請注意,資料型別名稱是 Roster,而不是 enum Roster。

現在已經建立了 student 變數,它可以被賦予一個值,如下所示:

student = Sharon;

變數的值可以這樣測試:

if (student == Sharon)

請注意,在這兩個例子中,Sharon 周圍沒有引號。因為它是一個命名常數,而不是字串常數。

即使列舉資料型別中的值實際儲存為整數,也不能總是將整數值替換為符號名稱。例如,不能使用下面的語句將 Sharon 賦值給 student:

student = 1; //錯誤

但是,可以使用整數值而不是符號名稱來測試列舉變數。例如,以下兩個 if 語句是等效的:

if (student == Bill)
if (student == 2)

還可以使用關係運算子來比較兩個列舉變數。例如,以下 if 語句確定儲存在 student1 中的值是否小於儲存在 student2 中的值:

if (student1 <student2)

如果 student1 等於 Bill,student2 等於 John,則該語句為 true。但是,如果 student1 等於 Bill,而 student2 等於 Sharon,則該語句將為 false。

如前所述,預設情況下,列舉列表中的符號將被賦給整數值 0、1、2 等等。如果這不合適,則可以指定要賦給的值,如以下範例所示:

enum Department { factory = 1, sales = 2, warehouse = 4 };

請記住,如果為列舉符號賦值,則它們必須是整數。以下賦值語句將產生錯誤:

enum Department { factory = 1.1, sales = 2.2, warehouse = 4,4 }; //錯誤

雖然沒有要求按升序排列賦給的整數值,但一般預設是這樣。

如果在賦值時省略了一個或多個符號,則它們將被賦給一個預設值,來看以下 2 個範例:

【範例 1】

enum Colors { red, orange, yellow = 9, green, blue };

在該範例中,命名常數 red 將被賦值為 0,orange 將為 1,yellow 將為 9,green 將為 10,blue 將為 11。

【範例 2】

enum Rooms { livingroom = 1, den, bedroom, kitchen };

在該範例中,livingroom 被賦值為 1,den 將為 2,bedroom 將為 3,kitchen 將為 4。

列舉資料型別的目的之一是符號名稱有助於使程式自我解釋。但是,由於這些名稱不 是字串,它們僅在程式中使用。在使用 Roster 資料型別的範例中,以下兩個語句將輸出 一個 2,而不是名稱 Sharon:

Roster student1 = Sharon;
cout << student1;

因為列舉資料型別的符號名稱與整數值相關聯,所以它們可以在 switch 語句中使用,如下面的程式所示,該程式還演示了可以使用列舉的資料型別,而不實際建立該型別的任何變數。
#include <iostream>
using namespace std;

// Declare the enumerated type
enum Roster { Tom = 1, Sharon, Bill, Teresa, John };
// Sharon - John will be assigned default values 2-5.

int main()
{
    int who;
    cin >> who;
    switch (who)
    {
        case Tom :
            cout << "Tom's birthday is January 3.n";
            break;
        case Sharon :
            cout << "Sharon's birthday is April 22.n";
            break;
        case Bill :
            cout << "Bill's birthday is December 19.n";
            break;
        case Teresa :
            cout << "Teresa's birthday is February 2.n";
            break;
        case John :
            cout << "John's birthday is June 17.n";
            break;
        default :
            cout << "Invalid selectionn";
    }
    return 0;
}
程式執行結果:

2
Sharon's birthday is April 22.