С помощью ключевого слова enum в языке C++ можно задать перечисляемый тип данных.
Для демонстрации того, как это можно делать, посмотрим на короткий пример программы на C++:
#include <iostream>
using namespace std;
enum sizes { S, M, L, XL, XXL };
enum { white, blue, yellow, black} t_shirt_color;
int main() {
sizes t_shirt_size = XL;
t_shirt_color = white;
cout << "My t-shirt size is: " << t_shirt_size << endl;
cout << "My t-shirt color is: " << t_shirt_color << endl;
}
Итак, мы задаём перечисляемый тип с именем sizes с возможными значениями: S, M, L, XL, XXL. Также мы создаём анонимный перечисляемый тип (т.е. без указания какого-то конкретного имени) для цветов со значениями white, blue, yellow, black и сразу определяем переменную t_shirt_color этого типа.
В самом методе main() мы определяем переменную t_shirt_size перечисляемого типа sizes, а также присваиваем ей значение XL.
Ранее определенной переменной t_shirt_color мы присваиваем значение цвета white.
Наконец, мы выводим на экран значение обеих переменных для наших перечисляемых типов, и вот что выведется на консоль при запуске программы:
My t-shirt size is: 3
My t-shirt color is: 0
Как видите, несмотря на то, что переменной t_shirt_size мы присвоили значение XL, на экран вывелось число 3, а не XL. Причина этому простая - когда вы задаете перечисляемый тип с помощью enum, то фактические значения для этого типа представляют собой целочисленные константы, имеющие значения от 0 и далее с прибавлением единицы для каждого последующего элемента типа - по количеству значений в перечисляемом типе. Таким образом, тип sizes фактически идентичен следующей записи:
enum sizes { S = 0, M = 1, L = 2, XL = 3, XXL = 4 };
Именно поэтому на экран вывелось 3, а не XL. Аналогично со значением t_shirt_color - на экран вывелось 0, поскольку white - это первый элемент нашего перечисляемого анонимного типа, содержащего названия цветов (в данном примере цветов футболок). C++ предоставляет возможность, как опускать явные присвоения для значений перечисляемого типа, так и задавать их разработчику напрямую. Давайте теперь чуть подправим нашу программу, чтобы она выглядела следующим образом:
#include <iostream>
using namespace std;
enum sizes { S, M = 10, L, XL, XXL };
enum { white = 2, blue, yellow, black} t_shirt_color;
int main() {
sizes t_shirt_size = XL;
t_shirt_color = yellow;
cout << "My t-shirt size is: " << t_shirt_size << endl;
cout << "My t-shirt color is: " << t_shirt_color << endl;
}
Из изменений, которые мы внесли:
- для значения M перечисляемого типа sizes мы явно определили значение 10
- для значения white анонимного перечисляемого типа, содержащего цвета футболок, мы явно определили значения 2
- переменной t_shirt_color мы теперь присваиваем значение yellow, вместо исходного white
Если мы запустим программу теперь, то на экран выведется следующее:
My t-shirt size is: 12
My t-shirt color is: 4
Из этого следует ещё один важный вывод: 12 вывелось потому, что при явном задании целочисленного значения для какого-то элемента перечисляемого типа - как в нашем примере M = 10 - все последующие элементы будут получать значение на единицу большее, чем предыдущее. Именно поэтому XL = 12, что и вывелось на экран. Аналогично, раз для white явно присвоено значение 2, то значение yellow анонимного типа соответствует константе 4.
Пожалуй, это основные особенности перечисляемых типов в языке C++. Их удобно использовать, к примеру, когда количество принимаемых значений для переменной ограничено и известно (в нашем примере футболки бывают строго заданных размеров и цветов). Попробуйте поэкспериментировать с ключевым словом enum и задать свои собственные перечисляемые типы. И не забудьте поделиться результатами экспериментов в комментариях к этой статье. Спасибо за внимание и удачи в освоении глубин языка C++!