C++ 枚舉類型

2023-03-20 16:24 更新

上一章我們談到了從真實(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)超出本書的范圍了。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)