• Index

枚举类型

Reads: 22

枚举枚举

我们知道,经常会出现只用truefalse两个值的情况。但经常也会出现只有几个值又不止两个值的情况。例如:月份。

这种情况,我们就可以自己使用关键字enum定义一个数据类型,这个数据类型声明的变量只保存一到十二月。

基础示例

废话不多说,先上代码:

#include <iostream> // std::cout std::endl

enum class month // 定义数据类型month
{
    january, // 一月
    february, // 二月
    march, // 三月
    april, // 四月
    may, // 五月
    june, // 六月
    july, // 七月
    aguest, // 八月
    september, // 九月
    october, // 十月
    november, // 十一月
    december // 十二月(最后的逗号可以写也可以不写)
}; // 记得写分号

int main(void)
{
    auto mymonth = month::january; // 使用数据类型month声明变量并初始化为一月
    mymonth = month::july; // 再赋值成七月
    std::cout << (mymonth == month::july ? "七月" : "不是七月") << std::endl;
    return 0;
}

输出结果:

七月

基础讲解

代码中month叫做枚举类型,而month里面一月到十二月叫做枚举项

基础拓展

由于用enum定义类型时使用了关键字class,所以当需要使用枚举项时,必须要加上枚举类型:

month mymonth = month::january;

如果用enum定义类型时没有使用关键字class,那么,类型可以加也可以不加:

enum color { red, green, blue };
color clr1 = red;
color clr2 = color::green;

不加枚举类型的话,那么就有可能与很多标识符冲突,所以一般还是建议加上枚举类型。为了提醒需要加上枚举类型,在定义枚举类型时使用enum class,那么,当你忘记添加枚举类型时,编译器编译时就会报错来告诉你没有加枚举类型。

深入枚举

基础示例

实际上,枚举项是整数字面量。看以下代码:

#include <iostream> // std::cout std::endl

int main(void)
{
    enum class color { red, green, blue, pink = 100, black, white };
    std::cout << static_cast<int>(color::red) << std::endl;
    std::cout << static_cast<int>(color::green) << std::endl;
    std::cout << static_cast<int>(color::blue) << std::endl;
    std::cout << static_cast<int>(color::pink) << std::endl;
    std::cout << static_cast<int>(color::black) << std::endl;
    std::cout << static_cast<int>(color::white) << std::endl;
    return 0;
}

输出结果:

0
1
2
100
101
102

基础讲解

static_cast<int>(color::red)将枚举值强制转换成int

那么,我们看到枚举值如果不赋值的情况下,是从0开始,当枚举值pink赋值为100后,后面的枚举值就会接着递增。

基础示例

我们还可以指定枚举类型使用的类型,但是必须是整数类型:

#include <iostream> // std::cout std::endl

int main(void)
{
    enum class color1 { red, green, blue, pink = 100, black, white }; // color1默认占用4个字节
    enum class color2 : unsigned char { red, green, blue, pink = 100, black, white }; // 指定类型后color2占用1个字节
    std::cout << sizeof(color1) << std::endl; // 4
    std::cout << sizeof(color2) << std::endl; // 1
    return 0;
}

基础讲解

关键字sizeof可以获取数据类型或者变量占用内存的大小,单位是字节。详细内容在后续讲解。

上述代码中sizeof(color1)获取到color1类型的变量占用4字节大小的内存,而sizeof(color2)获取到color2类型的变量占用1字节大小的内存。

补充知识(了解即可)

  1. enum class从C++11开始加入。
  2. 指定类型的enum从C++11开始加入。
  3. 带初始化的switch从C++17开始加入。

Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.