C ++包含許多內置數據類型。 但是對於我們想要做的事來說,這些類型有時並不夠用。 因此,C ++允許程序員創建自己的數據類型。 這些數據類型稱為用戶定義數據類型。
也許最簡單的用戶定義數據類型就是枚舉類型(Enumerated Types)。 枚舉類型中每個可能的值都定義為符號常量(稱為枚舉器)。
一、為什么用枚舉?
在了解其語法之前,先看看枚舉怎么個用途,是否有學的必要呢?其實枚舉是很實用的一個工具,主要體現在代碼閱讀方面。
設想這樣一個場景,一個項目,寫了上千行,有些常量類型,只有幾個固定的取值,在寫的時候為了圖方便,可以就用數字表示(如0,1,2,3),比如顏色,狀態等。這樣固然方便,且節省內存,但過了一個月再想看明白這個代碼,就不容易了吧。
再退一步,拿顏色舉例,有時要用上七八種顏色,如果用數字表示,對應起來也是極不方便,還得想半天,這時,如果顏色就用名字表示,但在內存中還是數字,就舒服得多了。
二、語法
1 定義
在C++中,枚舉類型是通過enum關鍵字定義的,比如定義顏色類型:
enum Color
{
COLOR_BLACK,
COLOR_RED,
COLOR_BLUE,
COLOR_GREEN,
COLOR_WHITE,
COLOR_CYAN,
COLOR_YELLOW,
COLOR_MAGENTA,
};
括號內為該類型所有可能的取值(枚舉器),以逗號分隔;大括號結尾要有分號。
注意:因為枚舉類型一旦定義,枚舉器就相當於全局常量,所以一般枚舉器的命名要有前綴且大寫,以防止和其他變量名沖突。
2 使用
Color c1(COLOR_WHITE);
Color c2 = COLOR_BLACK;
std::cout << c1 << endl;
std::cout << c2 << endl;
以上代碼輸出4和0,因為默認情況下,枚舉器的值依次為0,1,2...
當然也可以顯式地定義各個枚舉器的取值
enum Animal
{
ANIMAL_CAT = -3,
ANIMAL_DOG, // 自動賦值 -2
ANIMAL_PIG, // 自動賦值-1
ANIMAL_HORSE = 5,
ANIMAL_GIRAFFE = 5, // 與ANIMAL_HORSE共用同一個值
ANIMAL_CHICKEN // 自動賦值6
};
當一個枚舉器的值給定,下一個枚舉器默認賦值加1。同時也可對兩個枚舉器給同樣的取值,這時這兩個枚舉器是完全相同的,可以互換,僅僅名字不同。
三、其他用例
當需要表示一組特定的預定義狀態時,枚舉類型對於代碼可讀性而言非常有用。
例如,當函數內部發生錯誤時,函數通常將整數返回給調用方以表示錯誤代碼。 通常,小的負數用於表示不同的可能的錯誤代碼。例如:
int readFileContents()
{
if (!openFile())
return -1;
if (!readFile())
return -2;
if (!parseFile())
return -3;
return 0; // success
}
但是,使用像這樣的數字經常讓人雲里霧里。 一種替代方法是通過使用枚舉類型:
enum ParseResult
{
SUCCESS = 0,
ERROR_OPENING_FILE = -1,
ERROR_READING_FILE = -2,
ERROR_PARSING_FILE = -3
};
ParseResult readFileContents()
{
if (!openFile())
return ERROR_OPENING_FILE;
if (!readFile())
return ERROR_READING_FILE;
if (!parsefile())
return ERROR_PARSING_FILE;
return SUCCESS;
}
這比使用整數返回值更容易閱讀和理解。 在使用這個函數時,也將更為方便
if (readFileContents() == SUCCESS)
{
// do something
}
else
{
// print error message
}
最后,再提一句,我們常用的布爾類型,其實不過是枚舉類型的一個特例,枚舉類型在更大程度上豐富了布爾類型的用途。