【C++】枚舉類型及其用法


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
}

最后,再提一句,我們常用的布爾類型,其實不過是枚舉類型的一個特例,枚舉類型在更大程度上豐富了布爾類型的用途。


免責聲明!

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



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