[c++11]enum

参考:Enumerations (C++)

c++枚举(enum)类型是由一组自定义标识符(custom identifiers,也称为枚举器enumerator)定义的类型。枚举类型定义的对象可以赋值为任一个自定义标识符。

c++11开始,还可以使用枚举类型定义类,以及自定义枚举数据类型

枚举类型语法

参考:Enumerated types (enum)

定义枚举类型

enum type_name {
  value1,
  value2,
  value3,
  .
  .
} object_names;

type_name object_name = valuen;
  • 使用关键字enum定义枚举类型,输入类型名type_name和自定义标识符value1/value2/value3/...,就完成了枚举类型的定义

  • 可以直接输入object_names进行对象实例化,也可以用类型名来定义新的枚举对象

  • 枚举对象可以赋值为任一个自定义标识符

示例一

定义颜色枚举colors_t

enum colors_t {black, blue, green, cyan, red, purple, yellow, white};

创建枚举对象mycolor,赋值为其中一个自定义标识符,并进行测试

colors_t colors = green;

if (colors == green) {
    cout << "green" << endl;
}

输出结果:

green

枚举与整数的关系

使用枚举声明的枚举类型的值可以隐式转换为整数类型,反之亦然。默认自定义标识符集的第一个值转换成整数0,第二个转换成1,以此类推

也可以为枚举类型中的任何标识符指定特定的整数值。如果后面的标识符本身没有给出它自己的整数值,那么它会自动假定为前一个标识符表示的整数值加一

每个枚举对象的内存大小等同于整数值的大小:sizeof(int)=4

示例二

对于颜色枚举colors_t而言,枚举值green表示整数值2

colors_t colors = green;

if (colors == 2) {
    cout << "green" << endl;
}

结果

green

新建枚举类型months_t,第一个枚举值赋值为整数1,那么整数2表示的是第二个枚举值

enum months_t {
    january = 1, february, march, april,
    may, june, july, august,
    september, october, november, december
} y2k;


int main() {
    months_t months = (months_t) 2;

    if (months == february) {
        cout << "february" << endl;
    }

    return 0;
}

结果

february

比较枚举对象的大小和整数值的内存大小

    cout << sizeof(months) << endl;
    cout << sizeof(march) << endl;
    cout << sizeof(2) << endl;

结果

4
4
4

枚举类语法

参考: Enumerated types with enum class

c++11开始,可以定义枚举类

也可以定义枚举结构体:enum struct

定义枚举类类型

enum class type_name {
  value1,
  value2,
  value3,
  .
  .
} object_names;

type_name object_name = type_name::valuen;
  • 使用关键字enum class定义枚举类,输入枚举类名type_name,枚举类值value1/value2/value3/...

  • 以直接输入object_names进行对象实例化,也可以用类型名来定义新的枚举类对象

使用枚举类型定义类(即枚举类),里面的枚举值不能够隐式转换为int类型,能够保证类型安全;同时枚举器名称必须由枚举类型名称限定,有利于程序健壮性。

示例三

enum class colors_t {
    black, blue, green, cyan, red, purple, yellow, white
};

int main() {
    colors_t colors = colors_t::green;

    if (colors == (colors_t) 3) {
        cout << "green" << endl;
    }

    cout << sizeof(colors) << endl;
    cout << sizeof(colors_t) << endl;
    cout << sizeof(colors_t::green) << endl;

    return 0;
}

结果:

4
4
4

由测试结果可知,虽然其内存大小仍旧等同于整数,但枚举值无法转换为整数值

自定义数据类型

参考:Enumeration declaration

c++11开始,用枚举声明的枚举类型对其基础类型也有更多的控制;它可以是任何整型数据类型,比如char/short/unsigned int/int等等。指定数据类型可以有效减少占用内存

enum type_name : int_type {
  value1,
  value2,
  value3,
  .
  .
} object_names;

enum class type_name : int_type {
  value1,
  value2,
  value3,
  .
  .
} object_names;

在枚举类名后加上指定整数类型即可

测试四

enum class colors_t : char {
    black, blue, green, cyan, red, purple, yellow, white
};

cout << sizeof(colors) << endl;
cout << sizeof(colors_t) << endl;
cout << sizeof(colors_t::green) << endl;

结果

1
1
1

空枚举

如果枚举没有枚举器,则默认为0

enum byte_t : unsigned char {
};

int main() {
    byte_t byte;

    cout << byte << endl;
    cout << sizeof(byte) << endl;

    return 0;
}

结果

0
1