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

Перечисление — это совокупность целочисленных констант, описывающих все допустимые значения переменной. Если переменной присвоить значение не совпадающее с перечисленными константами, то компилятор выведет сообщение об ошибке. Объявление перечисления имеет следующий формат:

enum [<Название перечисления>] {
   <Список констант через запятую>
} [<Объявления переменных через запятую>];

Точка с запятой в конце объявления является обязательной. Чтобы объявить переменную, ее название указывается после закрывающей фигурной скобки при объявлении перечисления или отдельно, используя название перечисления в качестве типа данных:

[enum ]<Название перечисления> <Названия переменных через запятую>;

В языке C++ ключевое слово enum при объявлении переменной можно не указывать. Пример одновременного объявления перечисления и переменной:

enum Color {
   RED, BLUE, GREEN, BLACK
} color1;

Пример отдельного объявления переменной:

Color color2;

Константам RED, BLUE, GREEN и BLACK автоматически присваиваются целочисленные значения, начиная с нуля. Значение каждой последующей константы будет на единицу больше предыдущей. Нумерация производится слева направо. Таким образом, константа RED будет иметь значение 0, BLUE — 1, GREEN — 2, а BLACK — 3.

При объявлении перечисления константе можно присвоить другое значение. В этом случае последующая константа будет иметь значение на единицу больше этого другого значения. Пример:

enum Color {
   RED = 3, BLUE, GREEN = 7, BLACK
} color1;

В этом примере, константа RED будет иметь значение 3, а не 0, BLUE — 4, GREEN — 7, а BLACK — 8. Присвоить значение переменной можно так:

color1 = BLACK;

Можно также перед именем константы указать название перечисления и оператор :: (в этом случае редактор Eclipse выведет список со всеми константами из перечисления после ввода второго двоеточия):

color = Color::BLACK;

Допустимо не задавать одновременно название перечисления и объявление переменной. В этом случае переменные, указанные внутри фигурных скобок, используются как константы. Пример:

enum {
   RED, BLUE, GREEN, BLACK
};
std::cout << RED << std::endl;  // 0

Можно задать тип констант внутри перечисления, указав его после названия перечисления через двоеточие:

enum Color : unsigned long {
   RED = 1UL, BLUE, GREEN, BLACK
};

Пример использования перечисления приведен в листинге 3.26.

Листинг 3.26. Перечисления

#include <iostream>

enum Color {
   RED, BLUE, GREEN = 5, BLACK
};

int main() {
   Color color;          // Объявление переменной
   color = BLACK;
   std::cout << color << std::endl; // 6
   if (color == BLACK) { // Проверка значения
      std::cout << "color == BLACK" << std::endl;
   }
   else {
      std::cout << "color != BLACK" << std::endl;
   } // Выведет: color == BLACK
   return 0;
}

По умолчанию все константы перечисления находятся в глобальной области видимости, что может привести к конфликту имен. Начиная со стандарта C++11, можно избежать этого конфликта, указав после ключевого слова enum слово class или struct:

enum class Color {
   RED, BLUE, GREEN, BLACK
};

В этом случае константы доступны только через имя перечисления, после которого указывается оператор ::. В глобальной области видимости константы не определены. Пример доступа к константе из перечисления Color:

Color color;
color = Color::BLACK;

Следует также учитывать, что при использовании классовых перечислений преобразование константы в целое число или сравнение константы с целым числом становится недоступным.

Константы классового перечисления по умолчанию имеют тип int, но можно задать другой тип, указав его после названия перечисления через двоеточие:

enum class Color : long {
   RED, BLUE, GREEN, BLACK
};

Если тип указан явным образом или используются классовые перечисления, то стандарт C++11 допускает предварительное объявление перечисления:

enum class Color : long; // Предварительное объявление

Пример использования классового перечисления приведен в листинге 3.27.

Листинг 3.27. Классовые перечисления

#include <iostream>

enum class Color : long {
   RED, BLUE, GREEN, BLACK
};

int main() {
   Color color;          // Объявление переменной
   // color = BLACK;     // Ошибка! Только Color::BLACK
   color = Color::BLACK; // OK
   // std::cout << color << std::endl; // Ошибка преобразования
   // if (color == 3L) {               // Ошибка преобразования
   if (color == Color::BLACK) {        // OK
      std::cout << "color == Color::BLACK" << std::endl;
   }
   else {
      std::cout << "color != Color::BLACK" << std::endl;
   } // Выведет: color == Color::BLACK
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов