Перечисления в C++. Ключевое слово enum

User Rating: 5 / 5

С помощью ключевого слова 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++!

 

Яндекс.Метрика