C++ 枚舉類型

2023-03-20 16:24 更新

上一章我們談到了從真實世界的值(如撲克牌中的大小和花色)到程序世界內部表示(如整數或字符串)的映射。雖然我們實現了牌面大小和整型數、花色和整型數之間的映射,但必須指出,映射本身并沒有成為程序的一部分。

實際上,C++提供了一種稱為“枚舉類型”的特性使以下兩點成為可能,一是將映射作為程序的一部分,一是定義了組成映射的值的集合。比如,牌的花色(Suit)和大?。≧ank)可以以枚舉的形式定義:

enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
enum Rank { ACE=1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
TEN, JACK, QUEEN, KING };

默認情況下,枚舉類型中的第一個值映射為0,第二個映射為1,以此類推。如在Suit類型中,CLUBS(梅花)使用整型數0表示, DIAMONDS(方塊)使用1表示,等等。

Rank的定義中將ACE指定為1,覆蓋了默認的映射值。其他值以自然的方式遞推。

定義了這些類型之后,我們就可以在任何地方使用它們。比如,實例變量rank和suit可以分別用類型Rank和Suit來聲明:

struct Card
{
  Rank rank;
  Suit suit;
  Card (Suit s, Rank r);
};

構造函數的參數類型也相應改變了?,F在,我們可以以枚舉類型的值為參數創(chuàng)建Card對象:

Card card (DIAMONDS, JACK);

一般約定,枚舉類型中值的名字全部用大寫字母表示。上面代碼要比下面使用整型數的方式清晰地多:

Card card (1, 11);

枚舉類型中的值是用整型數表示的,所以可用作向量的下標。因此原來的print函數不加修改即可工作。不過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++;
  }
}

從某種程度上說,枚舉類型的使用會讓代碼的可讀性更好,不過同時也帶來了一點混亂。嚴格地講,不允許在枚舉類型上執(zhí)行數學運算,如suit++是不合法的。 而另一方面,在表達式suit+1中,C++自動將枚舉類型轉換為整型數,然后我們可以將結果強制轉換為枚舉類型:

suit = Suit(suit+1);
rank = Rank(rank+1);

當然,還有一種更好的處理方法,那就是為枚舉類型重載++操作符,但這已經超出本書的范圍了。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號