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、 列舉型別。 列舉型別是不可或缺的型別,因為它們可以當做陣列註標運算子的引數。 (如需詳細資訊,請參閱註標運算子。)