Перечисления


Перечисления (enum) представляют еще один способ определения своих типов. Их отличительной особенностью является то, что они содержат набор числовых констант.

Определим простейшее перечисление:

1
2
3
4
5
6
7
enum seasons
{
spring,
summer,
autumn,
winter
};
Для определения перечисления применяется ключевое слово enum, после которого идет название перечисления. Затем в фигурных скобках идет перечисление констант через запятую. Каждой константе по умолчанию будет присваиваться числовое значение начиная с нуля. То есть в данном случае spring=0, a winter=3.

Используем перечисление:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
enum seasons
{
spring,
summer,
autumn,
winter
};
int main()
{
seasons currentSeason = autumn;
// или так
// seasons currentSeason = seasons::autumn;
std::cout << "Season: " << currentSeason << std::endl;
return 0;
}
Мы можем определить переменную типа seasons и присвоить этой переменной значение одной из констант, объявленных в перечислении. Но фактически это будет числовое значение. В частности, консольный вывод данной программы:

1
Season: 2
В то же время перечисления - это отдельный тип, поэтому мы не можем присвоить переменной напрямую числовое значение:

1
seasons currentSeason = 2; // ошибка
Если нас не устраивают значения по умолчанию для констант, то мы можем явным образом задать значения. Например, установить начальное значение:

1
2
3
4
5
6
7
enum seasons
{
spring = 1,
summer, //2
autumn, //3
winter //4
};
В этом случае значения второй и последующих констант будет увеличиваться на единицу.

Также можно задать значение для каждой константы:

1
2
3
4
5
6
7
enum seasons
{
spring = 1,
summer = 2,
autumn = 4,
winter = 8
};
Когда необходимы перечисления? Перечисления могут использоваться, когда у нас есть ряд логически связанных констант, которые естественно лучше определить в одном общем типе данных. Например:

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
#include <iostream>
enum operations
{
add = 1,
subtract = 2,
multiply = 4
};
int main()
{
int operation;
int x1;
int x2;
int result;

std::cout << "Add: 1 \tSubtract: 2 \tMultiply: 4" << std::endl;
std::cout << "Input x1: ";
std::cin >> x1;
std::cout << "Input x2: ";
std::cin >> x2;
std::cout << "Input operation number: ";
std::cin >> operation;

switch (operation)
{
case operations::add:
result = x1 + x2;
break;
case operations::subtract:
result = x1 - x2;
break;
case operations::multiply:
result = x1 * x2;
break;
}

std::cout << "Result: " << result << std::endl;
return 0;
}
В данном случае все арифметические операции хранятся в перечислении operations. В зависимости от выбранной операции в конструкции switch производятся определенные действия.