枚举类型

枚举类型(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;
}