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) 引用。在方法中,类名可以省略。
,因为没有用户定义的增量运算符, curSuit 不能递增, Card::Suit 的后缀递增运算符定义。有关用户定义的运算符的更多信息,请参见 运算符重载。
下面的代码创建一个牌。
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,一个枚举类型。由于枚举类型是整型,它们可以用作数组下标运算符的参数。(有关更多信息,请参见 编写在下方的运算符。)