Язык программирования C++ от Страуструпа

Перечисления


Есть способ связывания имен с целыми константами, который часто более удобен, чем описание с 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

};

Задаваемые значения необязательно должны быть различными, положительными и идти в возрастающем порядке.



Содержание раздела