enum

C++的枚举类型提供了另一种创建符号常量的方式. 这种方式可以代替const, 还允许定义新类型, 但必须按严格的限制进行.

1
2
3
4
5
enum Spectrum {
red,
orange,
yellow
}

枚举的概念

枚举定义了新类型Spectrum, 称为枚举(enumeration)

将red, orange, yellow作为符号常量, 对应整数值$0-2$, 这些常量称为枚举量(enumerator)

枚举的属性

1
Spectrum band;
  • 在不进行强制类型转换的情况下, 只能将定义枚举时使用的枚举量赋给这种枚举的变量

    1
    2
    band = red; // valid
    band = 200; //invalid
  • 枚举是整型, 可以提升为int类型, 但int类型不能自动转换为枚举类型

    1
    2
    3
    4
    int color = blue; // valid
    band = 2 ;// invalid
    color = 3 + red; // valid
    band = Spectrum(2) // valid, 如果转换的整型有效
  • 对于枚举, 只定义了赋值运算符

    1
    2
    3
    band = red; // valid
    band = orange + red; // not valid, but a little tricky
    ++band; // not valid

设置枚举的值

1
enum season {spring, summer=3, autumn, winter};

没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5

1
enum season {spring=1, summer=3, autumn=1, winter=3};

作用域内枚举(C++11)

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
61
62
63
64
65
66
67
68
//作用域内枚举
#include<iostream>
using namespace std;

/* 下面这两种定义枚举的方式有错误,错误提示为枚举数sum重定义。
在C++11之前我们不能在类中定义两个枚举类型有相同的枚举数。这样会导致枚举数重定义的错误。
*/
//class Test1
//{
//public:
// enum {sum = 10};
// enum {sum = 20};
//};
//class Test2
//{
//public:
// enum grade{sum = 10};
// enum age{sum = 20};
//};

/*
C++11提供了定义域内枚举的使用方法,我们可以在类中定义两个枚举类型拥有相同名称的枚举数,
前提是用class关键字修饰枚举变量名称。 并且枚举变量的作用域为类内。
*/
class Test3 {
public:
enum class grade{sum = 10};
enum class age{sum = 20};
};

/* 无论是C++11之前的枚举变量还是新的作用域内枚举,
我们都可以显示的给枚举类型提供类型,前提是整形。 */
class Test4 {
public:
enum :long{sum = 123};
};

class Test5 {
public:
enum class grade:long { sum = 123 };
};

/* 另外,常规枚举可以和整形变量自动转换,存在隐患,作用域内枚举则不能隐式的转换为整形; */
class Test6 {
public:
enum{sum = 10};
void show() {
int number = sum;
cout << number << endl;
////常规枚举可以自动转换为整形
}
};

class Test7 {
public:
enum class grade{sum = 10};
void show() {
//int number = sum;
//此时不能隐式的转换为整形,但是可以进行显示的转换
int number = (int)grade::sum;
cout << number << endl;
}
};

int main() {
cin.get();
return 0;
}

enum hack

Older versions of C++ did not support the concept of ‘static const’ class members. In order to get around it, people used the so-called ‘enum hack’…
Code:

1
2
3
4
5
// Not supported
class foo { static const int i = 1000; };

// Enum hack
class foo { enum { i = 1000 }; };

优点

  • 不让别人获得一个pointer或reference指向某个整数常量
  • 不导致非必要的内存分配
文章目录
  1. 1. 枚举的概念
  2. 2. 枚举的属性
  3. 3. 设置枚举的值
  4. 4. 作用域内枚举(C++11)
  5. 5. enum hack
|