W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
上一章我們談到了從真實(shí)世界的值(如撲克牌中的大小和花色)到程序世界內(nèi)部表示(如整數(shù)或字符串)的映射。雖然我們實(shí)現(xiàn)了牌面大小和整型數(shù)、花色和整型數(shù)之間的映射,但必須指出,映射本身并沒有成為程序的一部分。
實(shí)際上,C++提供了一種稱為“枚舉類型”的特性使以下兩點(diǎn)成為可能,一是將映射作為程序的一部分,一是定義了組成映射的值的集合。比如,牌的花色(Suit)和大?。≧ank)可以以枚舉的形式定義:
enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
enum Rank { ACE=1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
TEN, JACK, QUEEN, KING };
默認(rèn)情況下,枚舉類型中的第一個(gè)值映射為0,第二個(gè)映射為1,以此類推。如在Suit類型中,CLUBS(梅花)使用整型數(shù)0表示, DIAMONDS(方塊)使用1表示,等等。
Rank的定義中將ACE指定為1,覆蓋了默認(rèn)的映射值。其他值以自然的方式遞推。
定義了這些類型之后,我們就可以在任何地方使用它們。比如,實(shí)例變量rank和suit可以分別用類型Rank和Suit來聲明:
struct Card
{
Rank rank;
Suit suit;
Card (Suit s, Rank r);
};
構(gòu)造函數(shù)的參數(shù)類型也相應(yīng)改變了?,F(xiàn)在,我們可以以枚舉類型的值為參數(shù)創(chuàng)建Card對(duì)象:
Card card (DIAMONDS, JACK);
一般約定,枚舉類型中值的名字全部用大寫字母表示。上面代碼要比下面使用整型數(shù)的方式清晰地多:
Card card (1, 11);
枚舉類型中的值是用整型數(shù)表示的,所以可用作向量的下標(biāo)。因此原來的print函數(shù)不加修改即可工作。不過buildDeck還是要做些修改,如下:
int index = 0;
for (Suit suit = CLUBS; suit <= SPADES; suit = Suit(suit+1)) {
for (Rank rank = ACE; rank <= KING; rank = Rank(rank+1)) {
deck[index].suit = suit;
deck[index].rank = rank;
index++;
}
}
從某種程度上說,枚舉類型的使用會(huì)讓代碼的可讀性更好,不過同時(shí)也帶來了一點(diǎn)混亂。嚴(yán)格地講,不允許在枚舉類型上執(zhí)行數(shù)學(xué)運(yùn)算,如suit++是不合法的。 而另一方面,在表達(dá)式suit+1中,C++自動(dòng)將枚舉類型轉(zhuǎn)換為整型數(shù),然后我們可以將結(jié)果強(qiáng)制轉(zhuǎn)換為枚舉類型:
suit = Suit(suit+1);
rank = Rank(rank+1);
當(dāng)然,還有一種更好的處理方法,那就是為枚舉類型重載++操作符,但這已經(jīng)超出本書的范圍了。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: