二級C++精品課程2-6:枚舉類型的相關(guān)知識

字號:

我們常常需要一些整型常量表示某一個(gè)的數(shù)據(jù)范圍。例如,假定需要表示汽車的顏色:
    const int cRED = 0;
    const int cBLUE = 1;
    …
    int auto_colour;
    auto_colour = cBLUE;
    上面的程序語句是用整型變量auto_colour表示顏色,下面的語句也是合法的:
    auto_colour = -1;
    …
    顯然,-1并不是所需要的顏色值。如果能夠限定auto_colour在限定的整數(shù)范圍(即規(guī)定的幾種顏色集合)內(nèi)取值就比較好,C++中的枚舉類型能夠讓我們做到這一點(diǎn)。枚舉類型是一種用戶定義的數(shù)據(jù)類型,其一般定義形式為:
    enum 枚舉類型名
    {
    標(biāo)識符[=整型常數(shù)],
    標(biāo)識符[=整型常數(shù)],
    ...
    標(biāo)識符[=整型常數(shù)],
    };
    "枚舉類型名"右邊花括號中的內(nèi)容稱之為枚舉表,枚舉表中的每一項(xiàng)稱之為枚舉成員,枚舉成員是常量,也就是說,枚舉表是整型常量的集合。枚舉成員之間用逗號隔開,方括號中的"整型常數(shù)"是枚舉成員的初值。
    如果不給枚舉成員賦初值,即省掉了標(biāo)識符后的"=整型常數(shù)"時(shí),則編譯器為每一個(gè)枚舉成員給一個(gè)不同的整型值,第一個(gè)成員為0,第二個(gè)為1,等等。當(dāng)枚舉類型中的某個(gè)成員賦值后,其后的成員則按依次加1的規(guī)則確定其值。下面是一個(gè)枚舉類型定義實(shí)例:
    enum Colour { eRED, eBLUE, eYELLOW, eGREEN,
    eSILVERGREY,eBURGUNDY };
    這樣就定義了一個(gè)稱之為Colour的枚舉類型,編譯器給枚舉成員eRED,…,eBURGUNDY的值分別為0,…,5。 定義了枚舉類型,就可以定義枚舉類型的變量,其值限定為某一個(gè)枚舉成員。例如:
    Colour auto_colour;
    …
    auto_colour = eBURGUNDY;
    Colour類型變量auto_colour只能取eRED,…,eBURGUNDY六個(gè)值中的一個(gè),下面的語句將會出現(xiàn)編譯錯(cuò)誤:
    auto_colour = 4;
    我們也可以在定義枚舉類型時(shí),為枚舉成員指定初值,例如:
    enum Colour { eRED=5, eBLUE, eYELLOW, Egreen=30,
    Esilvergrey=40,eBURGUNDY };
    這時(shí),eBLUE=6、Eyellow=7、Eburgundy=41。
    由上述幾種基本數(shù)據(jù)類型通過各種組合可以得到復(fù)合數(shù)據(jù)類型,這些數(shù)據(jù)類型在以后章節(jié)會有詳細(xì)講解。
    如果一個(gè)變量只有幾種可能的值,就可以把它定義為枚舉類型。"枚舉",顧名思義,就是把這種類型數(shù)據(jù)可取的值一一列舉出來。
    例如,可以定義一個(gè)表示日期的枚舉類型weekday:
    enum weekday{sun,mon,tru,wed,thu,fri,sat};
    這里enum是關(guān)鍵字,用于定義枚舉數(shù)據(jù)類型,weekday是枚舉類型的名字,枚舉元素用標(biāo)識符表示。
    接下來我們可以用weekday來定義變量,例如:
    weekday today,nextday;
    C++語言也允許在定義枚舉類型的同時(shí)定義枚舉變量,例如:
    enum weekday{sun,mon,tru,wed,thu,fri,sat}today,nextday;
    這樣,變量today和nextday就具有weekday類型,它們的取值只能是sun,mon,…,sta,例如可有:
    today = sun;
    nextday = mon;
    if(today == sat)
    nextday = sun //如果today是sat的話,那么nextday賦值為sun
    C++編譯器對枚舉元素實(shí)際上是按整型常數(shù)處理。所以,就象前面所說的那樣,當(dāng)遇到枚舉元素列表時(shí),編譯程序就把其中第一個(gè)標(biāo)識符賦0值,第二、三、…個(gè)標(biāo)識符依次賦1、2、…。因此,當(dāng)枚舉元素賦給枚舉變量時(shí),該變量實(shí)際得到一個(gè)整數(shù)值。例如:
    today = sun;
    是將0賦給today,而不是將字符串"sun"賦給today。賦值后:
    cout<    語句的輸出結(jié)果是0。
    我們也可以在枚舉類型定義時(shí)指定枚舉元素的值,例如:
    enum weekday{sun = 7,mon = 1,tue,wed,thu,fri,sat};
    這時(shí)sun的值是7,mon的值是1,而tue以后各元素的值,從mon的值開始,每次遞增1,即tue的值為2,wed的值為3,…。如果不寫mon = 1,則mon的值為8,tue的值為9,依此類推。
    由于枚舉元素是常量,所以我們在程序中不能對它們進(jìn)行賦值,如"sun = 0;mon = 1;"將產(chǎn)生錯(cuò)誤。
    既然枚舉元素就是整型值,那么它有什么存在的必要呢?至少有兩個(gè)原因:一個(gè)是用標(biāo)識符表示數(shù)值增加了程序的可讀性,例如:
    if(today == sat)
    next = sun
    就比
    if(today == 6)
    nextday = 0;
    清楚多了;另一個(gè)重要的原因是:它限制了變量取值的范圍,如現(xiàn)在today只能取sun~sat中的值。
    注意:enum在 C++和C中使用的不同。下面的C語言語句定義了名為day的變量:
    enum Days { Monday, Tuesday, Wednesday, Thursday, Friday };
    enum Days day;
    在C++中,定義為:
    enum Days { Monday, Tuesday, Wednesday, Thursday, Friday };
    Days day;
    C++中定義了枚舉類型數(shù)據(jù)后,程序可以把它當(dāng)作一種類型使用,不需在類型名Days前加enum關(guān)鍵字。