【C++】枚举

文章目录
  1. 1. 枚举
    1. 1.1. 声明与使用
    2. 1.2. 设置枚举的值
    3. 1.3. 枚举的取值范围
    4. 1.4. 应用实例
  2. 2. 枚举进阶
    1. 2.1. 1. 位运算支持
    2. 2.2. 2. 0值
    3. 2.3. 3. 用枚举代替define

概述: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