Перечисления используются для улучшения читабельности программы и представляют собой список целочисленных констант с названиями на естественном языке. Для определения перечислений используется следующий синтаксис:
enum имя_типа {
список_перечисления
} список_переменных;
В списке перечисления указывается перечень разделённых запятыми имен, которые и будут составлять перечисление. Имя типа задает название нового типа данных, которое будет сопоставлено перечислению. Список переменных указывать не обязательно – их можно объявить потом используя тип созданного перечисления.
Например, пусть необходима переменная, описывающая состояние светофора. Логично будет сопоставить каждому состоянию целое значение. К примеру, ноль будет обозначать красный цвет, единица – желтый, а двойка – зеленый. Но запоминать и использовать целые значения неудобно и программа получится сложной для понимания.
Если же воспользоваться перечислимыми типами, то можно дать следующее описание светофора:
enum light_type {
red, // красный
yellow, // желтый
green // зеленый
} svetofor;
Здесь создаются перечисление, имеющее тип light_type, и переменная этого типа – svetofor.
В дальнейшем в программе можно задать и другие переменные типа light_type:
light_type sv;
или
enum light_type sv;
Вторая форма записи – с указанием ключевого слова enum при задании переменной – унаследована от C и считается устаревшей.
Пример использования перечисления:
#include <iostream>
using namespace std;
enum light_type {
red,
yellow,
green
};
void main(){
light_type svetofor = green;
if (svetofor == red)
cout << "Красный\n";
else if (svetofor == yellow)
cout << "Желтый\n";
else if (svetofor == green)
cout << "Зеленый\n";
else
cout << "Непонятный\n";
system("pause");
}
Каждый элемент в списке перечисления означает целое число, причем каждое следующее число на единицу больше предыдущего. По умолчанию значение первого элемента перечисления равно нулю. Следовательно, в приведённом примере red = 0, yellow = 1, green = 2. Несмотря на то, что элементы перечисления представляют собой целые числа и при использовании автоматически к ним преобразуются, явно использовать числа при работе с перечислениями запрещено. Например, следующее присваивание корректно:
light_type svetofor = green;
Здесь в svetofor присваивается целое значение, соответствующее элементу перечисления green, т.е. 2. А если это сделать явно, то произойдет ошибка:
light_type svetofor = 2;
Компилятор не сможет преобразовать целое число к типу перечисления.
При определении перечисления можно явно указать целые значения, которые будут соответствовать его элементам:
enum signals
{
sighup = 1,
sigterm = 15,
sigkill = 9,
sigsegv = 11
}
В перечислении signals для каждого элемента задается явное целое значение. Конкретное значение можно задать и для одной переменной. Тогда следующему элементу присвоится значение на единицу большее предыдущего и т.д. Например:
enum months
{
jan = 1,
feb,
mar,
apr,
may,
jun,
jul,
aug,
sep,
oct,
nov,
dec
}
Здесь константе jan присваивается значение 1, следующей за ней feb – 2, mar – 3 и т.д.