Бьерн Страуструп - Язык программирования С++. Главы 2-4 - Перечисления

ОГЛАВЛЕНИЕ


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,
              most_significant=040000,
              least_significant=1
          };
Задаваемые значения необязательно должны быть различными, положительными и идти в возрастающем порядке.