枚举类型关键字为enum(enumeration),在C++11之后,枚举类型分为两类:

  1. 限定作用域的枚举类型(scoped (or strongly-typed) enum)
  2. 不限定作用域的枚举类型 (unscoped enum)

文章目录

  • 先说一下不限定作用域的枚举类型(unscoped enum)
  • 定义一个枚举数据类型
  • 使用枚举类型
  • 剖析枚举类型
  • 枚举量的使用
  • 数据类型转化规则
  • 再说一下限定作用域的枚举类型(scoped enum)
  • 定义
  • 指定枚举常量类型
  • 与整形关系
  • 参考文献


先说一下不限定作用域的枚举类型(unscoped enum)

定义一个枚举数据类型

enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

大括号中的元素称为枚举(常)量(enumerator)。

虽然只是建议,但是枚举(常)量要全部大写,这样的话在程序中这些常量会凸显出来,提醒程序员这些是枚举量而不是变量。——C++大学教程(第九版第165页)

还有一种写法,这种方法是把数据类型定义和定义Weekday数据类型变量合起来了,但是个人感觉很丑

enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}myDay;;

使用枚举类型

接下来就可以像int a一样定义一个数据类型为Weekday的变量了。

Weekday myDay=MONDAY;
enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}myDay=MONDAY;
    bool IWannaWork=true;
    if (IWannaWork==true)
        myDay=MONDAY;
    else
        myDay=SUNDAY;
    myDay=MONDAY;

注意枚举变量(如上面的Weekday)能且只能用枚举(常)量赋值,具体原因下文会解释。(类型转换除外)

剖析枚举类型

枚举量的使用

枚举类型的枚举量本质是从0开始的整数,然后后面每一个元素都依次加1。
如上面的

enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}myDay=MONDAY;

    cout<<MONDAY
        <<TUESDAY
        <<WEDNESDAY
        <<THURSDAY
        <<FRIDAY
        <<SATURDAY
        <<SUNDAY;
0123456

可以看出MONDAY=0,TUESDADY=1,…,SUNDAY=6
枚举类型的枚举量可以赋整数值,然后后面的还是依次加1。

enum Weekday {MONDAY=7, TUESDAY, WEDNESDAY, THURSDAY=0, FRIDAY, SATURDAY, SUNDAY};
7890123

数据类型转化规则

因为myDay是一个Weekday数据类型,所以以下语句非法

myDay+=1; //Assigning to 'enum Weekday' from incompatible type 'int'
    myDay=1;  //Assigning to 'enum Weekday' from incompatible type 'int'
    myDay=MONDAY+SATURDAY;  //Assigning to 'enum Weekday' from incompatible type 'int'
    myDay++;  //Cannot increment expression of enum type 'enum Weekday'

前三个的错误原因都一样,说enum Weekday被分配了int类型。
咦?枚举类型的元素怎么变成int了?——因为发生了隐式转化。
所以以下语句合法

int a=MONDAY+SATURDAY;//a=5

再说一下限定作用域的枚举类型(scoped enum)

scoped enum是c++11新增的,为啥要增加这个呢?是因为不同enum的枚举量的重名问题。比如

grpc上传枚举是不是字符串_枚举类型


这里两个枚举类都有RED这个枚举量,就报错了。

定义

enum class Weekday {MONDAY=7, TUESDAY, WEDNESDAY, THURSDAY=0, FRIDAY, SATURDAY, SUNDAY};
    Weekday myDay;
    myDay=Weekday::MONDAY;

语法:

enum [class|struct]
 [identifier] [: type]
 {enum-list};

其中使用class或struct是一毛一样的

用类型名为作用域,可以区分相同枚举量。
以下代码合法

enum class Color1{RED,BLUE,BLACK};
    enum class Color2{RED,GREEN,GRAY};
    Color1 a=Color1::RED;
    Color2 b=Color2::RED;

指定枚举常量类型

一个枚举类型中的常批表示为整数。 在默认情况下,无作用域限定的枚举类型所隐含的这种整型类型取决于它的枚举常量值,也就是说该整型类型应保证足以保存指定的常量值。 不过在默认情况下,作用域限定的枚举类型所隐含的整型类型是 int。 C++11允许程序员指定枚举类型所隐含的整型类型,方式是在枚举类型名称后跟随一个冒号(:)和指定的整型类型。
如下

enum class Color1:unsigned int{RED,BLUE,BLACK};

与整形关系

与整形的关系
限定作用域的枚举类型:不能隐式转换成整型

不限定作用域的枚举类型:可隐式转换成整型

整形不能隐式转换成枚举类型。