Перечисляемые типы (enum)

Перечисления (enum) используются в C++ для создания констант. Допустим надо объявить константы для музыкальных нот и каждую инициализировать соответствующим порядковым номером. Можно воспользоваться уже знакомым нам способом:

Такое объявление занимает много строк кода и не совсем удобно. Используя перечисление, можно определить эти константы иным способом. Синтаксис enum похож на синтаксис структур: ключевое слово — дескриптор — элементы в фигурных скобках через запятую :

Это полная форма — с дескриптором (именем перечисления). Как и в случае со структурами, имя перечисления можно не использовать:

В первом случае — мы сможем создавать переменные типа перечисления notes. Во втором случае — нет.

Обратите внимание, что значение 1 было присвоено только первому элементу перечисления. По умолчанию первому элементу в фигурных скобках присваиваются значение 0, второму на единицу больше (1), третьему на единицу больше второго (2) и т.д. Но если явно задать значение, как в примере, то увеличение на единицу начнется с этого числа. Покажем на экран значения некоторых элементов перечисления.

#include <iostream>

using namespace std;

 

enum notes{ DO = 1, RE, MI, FA, SOL, LA, SI };

 

int main()

{

setlocale(LC_ALL, "rus");

cout << DO << ' ' << RE << ' ' << SOL << endl;

return 0;

}

В консоли отобразится:

Хоть мы и не присваивали явно значения RE и SOL — они хранят правильные порядковые номера нот.

Имена перечислителей (элементов перечисления) должны быть уникальными. Значения же могут совпадать:

enum champions{ KLICHKO_VITALIY = 1, KLICHKO_VLADIMIR = 1, CHISORA, ADAMEK };

Значение 1 будут хранить KLICHKO_VITALIY и KLICHKO_VLADIMIR. 2 запишется в CHISORA, 3 — в ADAMEK . В элементы перечисления могут быть записаны только целые числа. Изменить ниже в программе значения, которые присвоены элементам в фигурных скобках нельзя. Если создается переменная типа перечисления — она может принять значение только одного из своих элементов:

На картинке видно, что записать число в переменную типа champions возможности нет. Можно записать только именованную константу, которая объявлена во время определения enum.

Для закрепления рассмотрим пример. В нём создадим перечисление levelsName. Оно будет содержать шесть элементов — «названия» этажей. Пользователю предложим «покататься» на лифте.

#include <iostream>

using namespace std;

 

enum levelsName { parking, bank, insurance, exchange, showroom, Restaurant };

 

int main()

{

setlocale(LC_ALL, "rus");

 

int floor = parking; // выбор пользователя - номер этажа

int exitOrNot = 1; // выйти или нет

 

while (exitOrNot == 1)

{

cout << "Номер этажа (0,1,2,3,4,5): ";

cin >> floor;

 

switch (floor)

{

case(parking) :

cout << "\a\a\aВы в паркинге!\n\n";

break;

 

case(bank) :

cout << "\a\a\aПервый этаж!";

cout << "\nЗдесь находится Креди Агриколь Банк.\n\n";

break;

 

case(insurance) :

cout << "\a\a\aВторой этаж!";

cout << "\nСтраховая компания UNICA.\n\n";

break;

 

case(exchange) :

cout << "\a\a\aТретий этаж!";

cout << "\nФондовая биржа.\n\n";

break;

 

case(showroom) :

cout << "\a\a\aЧетвёртый этаж!";

cout << "\nВыставочный зал и зал для презентаций.\n\n";

break;

 

case(Restaurant) :

cout << "\a\a\aПятый этаж!";

cout << "\nРесторан Sky.\n\n";

break;

 

default: cout << "\a\a\aОшибка!\n\n";

}

 

cout << "Выйти из лифта - нажмите 0.\n";

cout << "Выбрать другой этаж - нажмите 1: ";

do

{

cin >> exitOrNot;

} while (exitOrNot != 0 && exitOrNot != 1);

cout << endl;

}

return 0;

}

Объявляем целочисленную переменную floor в строке 10 и инициализируем ее именованной константой parking. Так floorпримет значение 0. В строке 13 входим в цикл while. Пока пользователь не введет в переменную exitOrNot значение 0, программа будет ему предлагать «кататься на лифте» — выбрать номер этажа. После каждого выбора этажа звучит сигнал (три коротких гудка) и на экран выводится номер этажа и информация о том, что на нём размещено. Это реализовано оператором выбора switch. Его блоки case перебирают элементы перечисления. То есть пользователь вводит целое число, а caseищет, какому из элементов перечисления оно соответствует. Например, если введено 5 — это соответствует значению элемента Restaurant — на экран выводится соответствующее сообщение.

Результат: