共用方式為


C + + 列舉宣告

列舉型別是一組具名常數,稱為列舉值所組成的使用者定義型別。

在 CLR 列舉的資訊,請參閱列舉類別

enum [tag] [: type] {enum-list} [declarator];   // for definition of enumerated type
enum tag declarator;   // for declaration of variable of type tag

參數

  • tag
    指定給列舉型別名稱。

  • type
    列舉型別識別項的基礎型別。 請參閱<備註>。

  • enum-list
    列舉型別所包含的列舉值的清單。

  • declarator
    指定的列舉型別名稱的宣告子清單。 如需詳細資訊,請參閱 多個宣告的概觀

備註

列舉型別提供的內容來描述各種值。 下列範例包含四個花色一疊紙牌中的列舉型別。

enum Suit { Diamonds, Hearts, Clubs, Spades };

列舉型別的每個名稱會變成列舉值,而對應的值指派給它的位置,在列舉型別值的順序。 預設情況下,第一個值被指派 0 下, 一個指定的 1,依此類推。 您可以設定列舉的值。

enum Suit { Diamonds = 1,
             Hearts, 
             Clubs,
             Spades };

列舉值Diamonds會將值指派給1。 這會影響值指派給後續的列舉值。 Hearts被指派的值為 2, Clubs為 3,以此類推。

在 c 中, enum關鍵字用來宣告列舉型別。 在 C++ 中, enum ,才能省略關鍵字。 例如:

Suit current;          // Legal in C++ only

列舉型別為基礎的變數可以指派特定的值。

Suit currentSuit = Hearts;

如果您嘗試指派hand值不是每週的某一天

int  myAccountNumber = 012345678;
Suit hand;

hand = myAccountNumber;

編譯器旗標在編譯時期錯誤與此工作分派。 雖然技術上來說這兩個變數沒有整數數字,轉換需要轉型int列舉型別。 不過,您可以到另一種方式,並提升至整數值轉換,否則列舉值。

myAccountNumber = hearts;

type是的基礎型別識別項。 這可以是任何數值類的型別,例如帶正負號或不帶正負號版本的int, short,或long。 bool或char也允許使用。

當物件可具有一組已知且相當有限的值,列舉型別是很有價值。 讓我們舉的花色一疊紙牌從:

// enumeration_declarations.cpp
// compile with: /c
class Card {
public:
   enum Suit {
      Diamonds,
      Hearts,
      Clubs,
      Spades
   };

   // Declare two constructors: a default constructor,
   //  and a constructor that sets the cardinal and
   //  suit value of the new card.
   Card();
   Card( int CardInit, Suit SuitInit );

   // Get and Set functions.
   int   GetCardinal();          // Get cardinal value of card.
   int   SetCardinal();          // Set cardinal value of card.
   Suit  GetSuit();              // Get suit of card.
   void  SetSuit(Suit new_suit); // Set suit of card.
   char *NameOf();               // Get string representation of card.

private:
   Suit  suit;
   int   cardinalValue;
};

// Define a postfix increment operator for Suit.
inline Card::Suit operator++( Card::Suit &rs, int ) {
   Card::Suit oldSuit = rs;
   rs = (Card::Suit)(rs + 1);
   return oldSuit;
}

上述範例中定義的類別中, Card,其中包含巢狀的列舉型別, Suit。

因為型別Suit為巢狀類別名稱 (Card) 公用的參考必須明確地使用。 在方法中,可省略的類別名稱。

後置遞增運算子,如Card::Suit定義,因為沒有使用者定義遞增運算子, curSuit無法遞增。 如需有關使用者定義運算子的詳細資訊,請參閱運算子多載

下列程式碼會建立封包的牌。

Card *Deck[52];
int   j = 0;

for( Card::Suit curSuit = Card::Diamonds ; curSuit <= Card::Spades ; curSuit++ )
   for( int i = 1; i <= 13; ++i )
      Deck[j++] = new Card( i, curSuit );

請考慮下列的範例與相關NameOf方法。

#define SIZE_OF_CARD_NAMES 20
char* Card::NameOf() {   // Get the name of a card.
   static char szName[SIZE_OF_CARD_NAMES];
   static char *Numbers[] = { 
      "1", "2", "3", "4", "5", "6", "7", "8", "9",
      "10", "Jack", "Queen", "King"
   };
   static char *Suits[] = {
      "Diamonds", "Hearts", "Clubs", "Spades" 
   };

   if( GetCardinal() < 13)
      strcpy_s( szName, SIZE_OF_CARD_NAMES, Numbers[GetCardinal()] );

   strcat_s( szName, SIZE_OF_CARD_NAMES, " of " );

   switch( GetSuit() ) {
      // Diamonds, Hearts, Clubs, and Spades do not need explicit
      //  class qualifier.
      case Diamonds:
         strcat_s( szName, SIZE_OF_CARD_NAMES , "Diamonds" );
      break;
      case Hearts:
         strcat_s( szName, SIZE_OF_CARD_NAMES , "Hearts" );
      break;
      case Clubs:
         strcat_s( szName, SIZE_OF_CARD_NAMES , "Clubs" );
      break;
      case Spades:
         strcat_s( szName, SIZE_OF_CARD_NAMES , "Spades" );
      break;
   }
   return szName;
}

列舉型別是整數類資料型別。 識別項會引入與enum即可使用宣告常數會出現。 一般情況下,第一個識別項值為 0 (Diamonds,在前面的範例),及數值增量是由另一個則用於每個後續的識別項。 因此,值Spades為 3。

列舉值不需要有唯一值,列舉型別。 每個列舉值的名稱會被視為常數,而且必須是唯一的範圍內的enum定義。

在清單中,包括第一個,任何列舉值可以會初始化成為其預設值以外的值。 假設的宣告Suit被下列:

enum Suit {
   Diamonds = 5,
   Hearts,
   Clubs = 4,
   Spades
};

然後這些值的Diamonds, Hearts, Clubs,以及Spades本來應該是 5、 6、 4 和 5,分別。 請注意 5 是一次以上。

這些列舉值的預設值簡化實作的NameOf函式:

#define SIZE_OF_CARD_NAMES 20
char* Card::NameOf() {   // Get the name of a card. 
   static char szName[SIZE_OF_CARD_NAMES];
   static char *Numbers[] = {
      "1", "2", "3", "4", "5", "6", "7", "8", "9",
      "10", "Jack", "Queen", "King"
   };
   static char *Suits[] = {
      "Diamonds", "Hearts", "Clubs", "Spades"
   };

   if( GetCardinal() < 13)
      strcpy_s( szName, SIZE_OF_CARD_NAMES, Numbers[GetCardinal()] );

   strcat_s( szName, SIZE_OF_CARD_NAMES, " of " );
   strcat_s( szName, SIZE_OF_CARD_NAMES, Suits[GetSuit()] );
   return szName;
}

存取子函式GetSuit傳回型別Suit、 列舉型別。 列舉型別是不可或缺的型別,因為它們可以當做陣列註標運算子的引數。 (如需詳細資訊,請參閱註標運算子。)

請參閱

參考

C 的列舉型別宣告

C + + 關鍵字

列舉值名稱

列舉值常數的定義

轉換和列舉型別