C++关键字-enum
枚举类型
枚举类型(enumeration)是 C++ 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
枚举元素作为常量,它们是有值的。编译系统为每个枚举常量指定一个整数值。默认状态下,这个整数值就是所列举元素的序号,序号从0开始。
可以在定义枚举类型时为部分或全部枚举常量指定整数值,在指定值之前的枚举常量仍按默认方式取值,而指定值之后的枚举常量按依次加1的原则取值。 各枚举常量的值可以重复。
enum Week {
SUN, // 默认从0开始
MON, // 1
TUE = 3, // 显式指定值
WED, // 上一个枚举值+1
THU = 6, // 显式指定值
FRI = 6, // 枚举值可以重复
SAT // 上一个枚举值+1
};
int main()
{
Week w;
w=FRI;
// Day of week: 5
std::cout<<"Day of week: "<< w << std::endl;
return 0;
}
枚举变量只能参与赋值、关系运算以及输出操作,参与运算时用其本身的整数值 允许的赋值:
Week w1 = MON;
Week w2 = w1;
int w3 = SAT;
int w4 = w2;
// 不能把常量或变量赋值给枚举类型
Week w5 = 1; // error: invalid conversion from ‘int’ to ‘Week’
// 可以使用static_cast强转,但没意义
Week w6 = static_cast<Week>(60); // 不会报错,且w6的值为60
允许的关系运算有:==、<、>、<=、>=、!=
if (w1 == w2)
std::cout<<"equals";
枚举类
考虑下面代码:
enum Color{RED,BLUE,YELLOR,BLACK,WHITE};
enum TrafficLight{RED,YELLOR,GREEN};
// error: ‘RED’ conflicts with a previous declaration
Color c = RED;
基础的枚举类型无法解决同一个作用域内,枚举类型的成员重名的问题。
枚举类枚举值具有传统枚举的功能——命名枚举值,同时又具有类的特点——具有类域的成员和无法进行默认的类型转换。
enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};
enum class TrafficLight{RED,YELLOR,GREEN};
Color c = Color::RED;
light l = TrafficLight::RED;
基础的枚举值的数据类型为int,
但是枚举类的数据类型可以自定义,但也必须是有符号或无符号整型,比如 char; unsigned int; unsigned long;
,默认为int。
enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};
enum class TrafficLight : char {RED,YELLOR,GREEN};
int main()
{
Color c = Color::RED;
TrafficLight l = TrafficLight::RED;
// 4
std::cout << sizeof(c) << std::endl;
// 1
std::cout << sizeof(l) << std::endl;
}
枚举类对类型限制更为严格,枚举类对象不可以与整型隐式地互相转换,这对于程序的类型保障就更强。
enum Color{RED,BLUE,YELLOR,BLACK,WHITE};
enum class TrafficLight {RED,YELLOR,GREEN};
int main()
{
Color c = RED;
TrafficLight l = TrafficLight::RED;
// 正确
int c1 = c;
// error: cannot convert ‘TrafficLight’ to ‘int’ in initialization
int l1 = l;
}