Байланысты: Бьерн Страуструп. Язык программирования С . М Бином, 2011
2.5.1. Перечисления Есть способ связывания имен с целыми константами, который часто более удобен, чем описание с
const. Например:
enum { ASM, AUTO, BREAK };
Здесь определены три целых константы, которые называются элементами перечисления, и им
присвоены значения. Поскольку по умолчанию значения элементов перечисления начинаются с 0 и
идут в возрастающем порядке, то приведенное перечисление эквивалентно определениям:
const ASM = 0;
const AUTO = 1;
const BREAK = 2;
Перечисление может иметь имя, например:
enum keyword { ASM, AUTO, BREAK };
Имя перечисления становится новым типом. С помощью стандартных преобразований тип
перечисления может неявно приводиться к типу int. Обратное преобразование (из типа int в
перечисление) должно быть задано явно. Например:
void f()
{
keyword k = ASM;
int i = ASM;
k = i //
ошибка
k = keyword(i);
i = k;
k = 4; //
ошибка
}
Последнее преобразование поясняет, почему нет неявного преобразования из int в перечисление:
большинство значений типа int не имеет представления в данном перечислении. Описав переменную с
типом keyword вместо очевидного int, мы дали как пользователю, так и транслятору определенную
информацию о том, как будет использоваться эта переменная. Например, для следующего оператора
keyword key;
switch (key) {
case
ASM:
// выполнить что-либо
break;
case
BREAK:
// выполнить что-либо
break;
}
транслятор может выдать предупреждение, поскольку из трех возможных значений типа keyword
используются только два. Значения элементов перечисления можно задавать и явно. Например:
enum int16 {
sign=0100000,
Бьерн Страуструп.
Язык программирования С++
66
most_significant=040000,
least_significant=1
};
Задаваемые значения необязательно должны быть различными, положительными и идти в
возрастающем порядке.