一、枚举类介绍
枚举类(Enumerated types)是一种用户自定义的类型,用户自定义标识符(identifers)作为类型的名称,然后设置一系列枚举子(enumerators)作为类型的可赋值。枚举类的对象可以选这些enumerator作为其的值。
语法:
enum type_name {
value1,
value2,
value3,
.
.
} object_names;
或者
// unscoped enum:
enum [identifier] [: type] {enum-list};
// scoped enum:
enum [class|struct] [identifier] [: type] {enum-list};
举例:
enum colors_t {black, blue, green, cyan, red, purple, yellow, white};
colors_t mycolor;
mycolor = blue;
if (mycolor == green) mycolor = red;
二、enum定义方法
用enum定义的类型中的值总是被隐式自动赋予int类型的值,相当于这些enumerator的别名。如果没有特别说明,那么第一个enumerator被赋值0,第二个被赋值1,以此类推。如果给enumerator设值,而其后一个enumerator没有被赋值,那么这一位的值就是前一位的用户赋值+1。
举例A:
enum months_t { january=1, february, march, april,
may, june, july, august,
september, october, november, december} y2k;
在这里,january到december的值的区间为1-12。注意,1和january在这个枚举类型中没有差别,作用是一样的。
举例B:
enum Suit { Diamonds = 5, Hearts, Clubs = 4, Spades };
则Diamonds, Hearts, Clubs, 和 Spades 的值分别是 5, 6, 4, and 5。
举例C:
int类型不能被转换为enum类型:
int account_num = 135692;
Suit hand;
hand = account_num; // error C2440: '=' : cannot convert from 'int' to 'Suit'
但是enum类型可以被转换为int类型:
int account_num = Hearts; //OK if Hearts is in a unscoped enum
三、enum class定义方法
1.可以创建不被隐式转换为int类型的枚举类,用来保证类型的安全性。创建方法使用的是enum class而不是enum关键字。
举例:
enum class Colors {black, blue, green, cyan, red, purple, yellow, white};
使用这种方法定义后,在用到enumerator值时必须标明到该类型空间中(enum定义方法也可如此使用):
Colors mycolor;
mycolor = Colors::blue;
if (mycolor == Colors::green) mycolor = Colors::red;
2.用enum class定义的枚举类型对于其隐式类型有更好的可控性。可以设置为int类型,char类型,short类型等,不同类型使得枚举类型占用的空间也不同。
举例:
enum class EyeColor : char {blue, green, brown};
这样定义之后,EyeColor就是一个和char类型有相同大小的独立类型。
3.使用例子:
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
{ /*...*/
}
}
}
注:原文转自http://www.cplusplus.com/doc/tutorial/other_data_types/和http://msdn.microsoft.com/en-us/library/2dzy4k6e.aspx,翻译的时候有删改,仅供自己参考。