
Перечисления (enumerations). Ключевое слово enum. Преимущества использования перечислений. Примеры
Содержание
- 1. Общие сведения о перечислениях. Преимущества использования перечислений в программах
- 2. Общая форма объявления перечисления. Ключевое слово enum. Особенности работы перечисления
- 3. Каким образом в перечислении можно задать значение перечислительным константам? Пример
- 4. Константные значения каких типов данных разрешается использовать в перечислениях?
- 5. Могут ли в перечислениях использоваться отрицательные значения перечислительных констант?
- 6. Примеры объявления разных видов перечислений с различными способами начальной инициализации
- 7. Примеры объявления и использования перечислений в программах
- 8. Какая область видимости константы, объявленной в перечислении?
- 9. Объявление типа перечисления с использованием средства typedef. Общая форма. Пример
- Связанные темы
1. Общие сведения о перечислениях. Преимущества использования перечислений в программах
Тип данных «перечисление» используется для создания именованных идентификаторов, представляющих некоторое целочисленное константное значение.
Перечисления позволяют объединять группы константных значений в единое целое. Формируется тип перечисления на основании которого может быть объявлена переменная, которая принимает значение из набора, который описывается в перечислении.
При использовании перечислений в программах можно выделить следующие взаимосвязанные преимущества:
- можно создавать разные типы перечислений, каждое из которых содержит группы констант которые формируются по некоторому признаку;
- константы в перечислении группируются. Если в программе есть большие наборы констант, то это облегчает читабельность и дальнейшее сопровождение программы.
⇑
2. Общая форма объявления перечисления. Ключевое слово enum. Особенности работы перечисления
Чтобы объявить перечисление в языке C++ используется ключевое слово enum.
Общая форма объявления перечисления следующая:
enum TypeName
{
name1 [=const1],
name2 [=const2],
...
nameN [=constN]
};
здесь
- TypeName – имя типа перечисление (имя шаблона);
- name1, name2, …, nameN – имена идентификаторов-констант, которые принимают соответственно значения const1, const2, …, constN. Необязательно идентификатора-константы должны принимать значение. Квадратные скобки [ ] означают, что константное значение может отсутствовать;
- const1, const2, …, constN – необязательные значения, задающие значение константам, которые пересчитываются в перечислении.
Если значение константы в перечислении не задано, то оно принимает значение, которое есть на 1 больше чем предыдущее константное значение. Например, если предыдущая константа имела значение 5, то следующая будет иметь значение 6. В случае типа char следующая константа есть следующим символом в таблице символов.
После объявления типа (шаблона) перечисления, можно объявлять переменные этого типа, например
TypeName varName;
здесь
- TypeName – имя ранее объявленного типа (шаблона) перечисления;
- varName – имя переменной типа TypeName.
Если объявлена переменная, то эта переменная в программе может принимать значение имени из перечисления, например
varName = name2;
⇑
3. Каким образом в перечислении можно задать значение перечислительным константам? Пример
Значение перечислительным константам можно задать одним из двух способов:
- с помощью явной инициализации. В этом случае, после имени константы ставится знак равно = и значение, которое принимает данная константа;
- по умолчанию. В этом случае первой константе ставится в соответствие 0, а каждая последующая константа принимает значение на 1 больше.
Пример.
// явная инициализация
enum DAYS_IN_MONTHS {
January = 31,
February = 28,
March = 31,
April = 30,
May = 31,
June = 30,
July = 31,
August = 31,
September = 30,
October = 31,
November = 30,
December = 31
};
// инициализация по умолчанию
enum DIGITS
{
Zero, // Zero=0 - по умолчанию
One, // One=1
Two,
Three,
Four,
Five,
Six, // Six = 6
Seven,
Eight,
Nine // Nine = 9
};
⇑
4. Константные значения каких типов данных разрешается использовать в перечислениях?
В перечислениях допускается использовать константные значения следующих типов:
- целочисленных типов (int, long int, …);
- символьного типа char;
- логического типа bool.
Запрещается использовать константные значения типов с плавающей запятой float, double. При попытке объявить константное значение типа double или float
...
enum DBL { x = 2.65 };
...
компилятор выдаст сообщение об ошибке
Error 1 : constant expression is not integral
⇑
5. Могут ли в перечислениях использоваться отрицательные значения перечислительных констант?
Да, могут. Например
enum VALUES {
val1 = 2,
val2 = 'c',
val3 = true,
val4 = -9
};
В перечислении VALUES используется отрицательная константа
val4 = -9
⇑
6. Примеры объявления разных видов перечислений с различными способами начальной инициализации
Пример 1. Объявляется перечисление, реализующее месяцы года.
// перечисление, реализующее константы, которые соответствуют месяцам года
enum MONTHS { Jan = 1, Feb, Mar, Apr, May, Jun,
Jul, Aug, Sep, Oct, Nov, Dec };
Первому месяцу года относится в соответствие константа с именем Jan. Значение константы равно 1. Следующая константа носит имя Feb, значение константы равно 2 (на 1 больше). По такому же принципу формируются константы, которые следуют после Feb. Значение каждой последующей константы больше на 1.
Пример 2. Объявляется перечисление vegetables, которое описывает овощи.
// перечисление, описывающее овощи
enum Vegetables {
tomato, potato, carrot, cabbage, pepper, onion, radish
};
⇑
7. Примеры объявления и использования перечислений в программах
Пример 1. Использование перечисления в сочетании с оператором switch. Разработать программу, которая по значению константы из перечисления MONTHS выводит название соответствующего месяца.
#include <iostream>
using namespace std;
void main(void)
{
// перечисление, реализующее константы, которые соответствуют месяцам года
enum MONTHS { Jan = 1, Feb, Mar, Apr, May, Jun,
Jul, Aug, Sep, Oct, Nov, Dec };
// переменная mn типа перечисление MONTHS
MONTHS mn;
// присвоить значение переменной mn
mn = Mar; // mn = 3
// использование mn в операторе switch
// по значению mn вывести название соответствующего месяца
switch (mn)
{
case Jan: cout << "January" << endl; break;
case Feb: cout << "February" << endl; break;
case Mar: cout << "March" << endl; break;
case Apr: cout << "April" << endl; break;
case May: cout << "May" << endl; break;
case Jun: cout << "June" << endl; break;
case Jul: cout << "July" << endl; break;
case Aug: cout << "August" << endl; break;
case Sep: cout << "September" << endl; break;
case Oct: cout << "October" << endl; break;
case Nov: cout << "November" << endl; break;
case Dec: cout << "December" << endl; break;
}
}
Если попробовать вывести значение mn, то будет выводиться его целочисленное цифровое значение. Например, в коде
mn = Oct; cout << mn; // 10
будет выводиться число 10. Идентификатор ‘Oct’ выводиться не будет.
Пример 2. Использование перечислений с оператором if. Реализация перечисления, которое описывает времена года. В программе по значению переменной типа перечисление выводится название соответствующего времени года.
#include <iostream>
using namespace std;
void main()
{
// перечисление, реализующие времена года
enum SEASON {
winter, spring, summer, autumn
};
int i;
SEASON sz;
sz = spring;
// по значению sz вывести название соответствующего времени года
if (sz == winter)
cout << "Winter" << endl;
if (sz == spring)
cout << "Spring" << endl;
if (sz == summer)
cout << "Summer" << endl;
if (sz == autumn)
cout << "Autumn" << endl;
}
⇑
8. Какая область видимости константы, объявленной в перечислении?
Константа, объявленная в перечислении, имеет область видимости в пределах скобок, в которых объявляется шаблон (тип) перечисления.
Например.
Дано перечисление NUMBERS, в котором объявлены 3 константы с именами num1, num2, num3. Если в этом же блоке операторных скобок { } объявить переменную с именем num2
...
{
// область видимости имен num1, num2, num3
enum NUMBERS
{
num1 = 15,
num2 = 77,
num3 = -1232
};
// попытка объявить имя num2
int num2 = 122; // ошибка!!!
}
то компилятор выдаст ошибку
Error: 'num2' : redefinition; previous definition was 'enumerator'
⇑
9. Объявление типа перечисления с использованием средства typedef. Общая форма. Пример
Перечисление можно также объявлять с использованием ключевого слова typedef. В этом случае общая форма такого объявления следующая
typedef enum TypeName {
// перечень констант и константных значений
// ...
};
здесь TypeName – имя нового типа перечисления, которое создается.
Пример. С помощью ключевого слова typedef объявляется тип TDAYS, который есть перечислением. Затем объявляется переменная типа TDAYS.
// объявить новый тип TDAYS, который есть тип-перечисление
typedef enum TDAYS {
Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat
};
// объявить переменную типа TDAYS
TDAYS td;
// присвоить переменной td значение из набора типа TDAYS
td = TDAYS::Sun;
Источник
