C++枚举和枚举类
枚举
定义:枚举(enumeration)是一个自定义类型的方式。
作用:限定变量的取值范围为数个明确命名的常量(枚举项(enumerator))。
关键字:
c++11 之前 enum
c++11 之后 enum, enum class, enum struct
# enum 不限范围的枚举类型
一般形式1:
enum 类型名 // 【类型名】 为新的数据类型;
{
类型1, // 【类型1】为符号常量,默认从0开始; 【类型1】= 0
类型2 = 常量表达式, // 符号常量,也可以被表达式赋值; 【类型2】= 2
类型3 // 符号常量的值是顺延的; 【类型3】= 3
};
1
2
3
4
5
6
2
3
4
5
6
例:定义weekday 并使用
#include <iostream>
#include <cstring>
using namespace std;
enum Weekday
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
class Cat
{
public:
void eat(Weekday day)
{
switch (day)
{
case Mon:
cout << "This is Mon, I want fish;" << endl;
break;
case 1:
cout << "This is Tues, I want fish;" << endl;
break;
case Wed:
cout << "This is Wed, I want fish;" << endl;
break;
case Thur:
cout << "This is Thur, I want fish;" << endl;
break;
case Fri:
cout << "This is Fri, I want fish;" << endl;
break;
default:
cout << "I want fish, everyday!" << endl;
break;
}
}
};
int main(int argc, char* argv[])
{
Cat oCat;
oCat.eat(0);
oCat.eat(Weekday::Tues);
Weekday oDay1 = Wed;
oCat.eat(oDay1);
Weekday& oDay2 = oDay1;
oDay2 = Thur;
oCat.eat(oDay2);
return 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
结果:
This is Mon, I want fish;
This is Tues, I want fish;
This is Wed, I want fish;
This is Thur, I want fish;
# 局限
1、 enum的枚举类型是 C++98版本就引入的,呆呆之前说过 C++有作用域的概念,但在这里有点小特殊;我们发现可以在 main 函数中直接使用 Mon。
这就意味着:枚举的声明已经突破了作用域的范围;一旦定义了枚举就无法定义同名类,同名变量。
2、 隐式转换问题,由上代码事例可发现;枚举 和 int 可以无障碍的隐式转换;这可能让一些笔误逃过编译器的探查,导致一些未知的问题。
ps: 并不是每个编译器都可以正常的隐式转换,如果使用新版编译器,可减少对应错误
# enum class
enum class
是 C++11
提出的,可完美解决以上问题
一般形式:
enum class 类型名 // 【类型名】 为新的数据类型;
{
类型1, // 【类型1】为符号常量,默认从0开始; 【类型1】= 0
类型2 = 常量表达式, // 符号常量,也可以被表达式赋值; 【类型2】= 2
类型3 // 符号常量的值是顺延的; 【类型3】= 3
};
1
2
3
4
5
6
2
3
4
5
6
例:
enum class Weekday
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
由于使用了 class
关键字,所以做类似其他类一样做前置申明
总结,枚举类有以下3个优点:
笔记
1、降低命名空间污染
2、避免发生隐式转换
3、可以前置声明
编辑 (opens new window)
上次更新: 2023/04/09, 07:45:01