|
枚举提供上下文来描述以命名常量表示的一系列值。 这些命名常量也称为“枚举器”。 在原始 C 和 C++ enum 类型中,非限定枚举器在声明 enum 的整个范围中可见。 在区分范围的枚举中,枚举器名称必须由 enum 类型名称限定。 以下示例演示两种枚举之间的基本差异:
namespace CardGame_Scoped
{
enum class Suit { Diamonds, Hearts, Clubs, Spades };
void PlayCard(Suit suit)
{
if (suit == Suit::Clubs) // Enumerator must be qualified by enum type
{ /*...*/}
}
}
namespace CardGame_NonScoped
{
enum Suit { Diamonds, Hearts, Clubs, Spades };
void PlayCard(Suit suit)
{
if (suit == Clubs) // Enumerator is visible without qualification
{ /*...*/
}
}
}
将为枚举中的每个名称分配一个整数值,该值与其在枚举中的顺序相对应。 默认情况下,为第一个值分配 0,为下一个值分配 1,以此类推,但你可以显式设置枚举器的值,如下所示:
enum Suit { Diamonds = 1, Hearts, Clubs, Spades };
为枚举器 Diamonds 分配值 1。 后续枚举器接收的值会在前一个枚举器的值的基础上加一(如果没有显式赋值)。 在前面的示例中,Hearts 将具有值 2,Clubs 将具有值 3,依此类推。
每个枚举器将被视为常量,并且必须在定义 enum 的范围内(对于未区分围的枚举)或在 enum 本身中(对于区分范围的枚举)具有唯一名称。 为这些名称指定的值不必是唯一的。 例如,考虑未区分范围的枚举 Suit 的以下声明:
enum Suit { Diamonds = 5, Hearts, Clubs = 4, Spades };
Diamonds、Hearts、Clubs 和 Spades 的值分别是 5、6、4 和 5。 请注意,5 使用了多次;尽管这并不符合预期,但是允许的。 对于区分范围的枚举来说,这些规则是相同的。
|
|