【C++】枚举

概述:C++枚举的说明和使用

[toc]

枚举

C++的枚举工具提供了另一种创建符号常量的方式,这种方式可以代替const。还允许定义新类型,但必须按严格的限制执行。使用enum的句法与struct类似。

enum color { red, orange, blue, green, red, black}

这条语句定义了一个名为color的新类型,它的取值范围为red, orange, blue, green, red, black,称为符号常量,同时将0~5分别对应于red~black。在默认情况下,0对应的是red,5对应的是black,其他以此类推。

声明与使用

1
2
3
4
color cor1; //定义了一个类型为color的变量cor1
//枚举变量的赋值
cor1 = red; //正常赋值
cor1 = 20; //非法,20不是枚举变量

由此可以看出,枚举变量的赋值受到限制,与程序员的定义有关。

  • 对枚举而言,它的操作符只有赋值运算符=,这就意味着枚举变量不能执行++、--、+、—等号以外的操作。

  • 枚举量是整形,可被提升为int类型,但int类型不能自动转换为枚举类型

  • 枚举可以进行强制类型转换,但不确定其结果,如cor1 = spectrum(100);

  • 如果只打算使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称 enum {red,orange}

设置枚举的值

可以使用赋值运算符显式地来设置枚举量的值:

1
enum bits {one = 1, two = 2, three = 3};

但是,指定的值必须是整数。也可以只显式的设置其中一部分的值,默认情况下,枚举的 第一个常量始终是从0开始的,这一点需要注意。

1
enum digits {zero, one = 0, two, three = 1};

这里,zeroone的枚举量都为0,twothree都是1

除了可以将int类型的值赋值给枚举量,还可以使用longlong long类型的值。

枚举的取值范围

现在有指定了枚举量的枚举如下所示:

1
2
3
enum bits(one = 1, two = 2,four = 4,eight = 8};
bits myflag;
myflag = bits(6);

问:

上述赋值是否合法
	合法,虽然`6`不是枚举量,但它位于枚举定义的取值范围内。

关于取值范围的定义(参考C++ primer 第六版):

1
enum bigstep(firat,second = 100, third};

首先,要找出上限,需要知道枚举量的最大值。找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。例如,定义的bigstep的最大值枚举值是101。在2的幂中,比这个数大的最小值为128,因此取值范围的上限为127。要计算下限,需要知道枚举量的最小值。如果它不小于0,则取值范围的下限为0∶否则,采用与寻找上限方式相同的方式,但加上负号。


例如,如果最小的枚举量为-6,而比它小的、最大的2的幂是-8(加上负号),因此下限为-7。选择用多少空间来存储枚举由编译器决定。对于取值范围较小的枚举,使用一个字节或更少的空间∶而对于包含 long类型值的枚举,则使用4个字节。

应用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include "main.h"
using namespace std;
enum myFlag {
one,
two = 0,
three,
four = 1
};
int main()
{
cout << three << endl;
myFlag flag = myFlag(0);
cout << flag << endl;
system("pause");
return 0;
}

输出结果:

1
0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
int main()
{

enum color { red=1, green, blue };

enum color favorite_color;

/* 用户输入数字来选择颜色 */
printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
scanf("%u", &favorite_color);

/* 输出结果 */
switch (favorite_color)
{
case red:
printf("你喜欢的颜色是红色");
break;
case green:
printf("你喜欢的颜色是绿色");
break;
case blue:
printf("你喜欢的颜色是蓝色");
break;
default:
printf("你没有选择你喜欢的颜色");
}

return 0;
}
请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
你喜欢的颜色是红色

枚举进阶

1. 位运算支持

在使用枚举时结合到 2进制 的强大,对枚举值自由的进行异或运算。

举例一:

1
2
3
4
5
6
7
enum AttributeTargets
{
Assembly = 0x0001,
Class = 0x0002,
Struct = 0x0004
...
};

举例二:

但是在

1
2
3
4
5
6
enum FileAccess
{
Read = 0x1,
Write = 0x2,
ReadWrite = Read | Write
};

2. 0值

为简单枚举提供一个 0 值枚举量,可以考虑将其命名为 None。如果这个名对于特定的枚举不合适的时候,可以自行找一个准确的。

1
2
3
4
5
6
enum Compression
{
None = 0,
GZip,
Deflate
};

3. 用枚举代替define

在合适的情况下尽量使用枚举类型,而不是静态常量或 “#define” 值 。枚举 类型是一个具有一个静态常量集合的结构体。如果遵守这些规范,定义枚举类型,而不是带 有静态常量的结构体,您便会得到额外的编译器和反射支持,在调试代码时也能更加直观。

Good:

1
2
3
4
5
6
7

enum Color
{
Red,
Green,
Blue
};

bad:

1
2
3
4
5
6
7
const int RED = 0;
const int GREEN = 1;
const int BLUE = 2;

#define RED 0
#define GREEN 1
#define BLUE 2

【C++】枚举
https://hodlyounger.github.io/D_立志博览群书/《C++ primer plus》/【Cpp】enum/
作者
mingming
发布于
2023年10月27日
许可协议