R Справочное руководство по С++

R.7.2 Описание перечисления.

   


Назад  |  Вперёд

Перечисление является отдельным целочисленным типом ($$R.3.6.1) с константами-именами. Его имя в своей области видимости становится конструкцией имя-перечисления, т.е. служит зарезервированным словом.

           имя-перечисления:
               идентификатор

           спецификация-перечисления:
               enum идентификатор opt { список-перечисления }

           список-перечисления:
               элемент-перечисления
               список-перечисления , элемент-перечисления

           элемент-перечисления:
               идентификатор
               идентификатор = выражение-константа

Все идентификаторы из списка-перечисления считаются описанными как константы и могут появляться всюду, где требуются константы. Если не было элементов перечисления с =, то значения констант начинаются с нуля и последовательно увеличиваются на единицу по мере продвижения в списке слева направо. Если элемент перечисления встретился с =, то его идентификатор принимает заданное значение, а последующие идентификаторы без инициализирующей части будут получать возрастающие значения, начиная с заданного. Значение элемента перечисления должно быть типа int или значением, которое можно привести к int с помощью стандартных целочисленных преобразований ($$R.4.1).

Имена элементов перечисления должны быть отличны от имен обычных переменных и других элементов перечисления той же области видимости. Значения элементов перечисления не обязаны отличаться друг от друга. Считается, что элемент перечисления описан с момента появления его идентификатора или инициализирующего значения, (если оно есть). Например, в определениях

           enum { a, b, c=0 };
           enum { d, e, f=e+2 };

значения a, c, и d заданы как 0, b и e как 1, а f как 3.

Каждое перечисление является целочисленным типом, который отличен от всех других целочисленных типов. Типом элемента перечисления считается данное перечисление. Значение элемента перечисления или объекта типа перечисления преобразуется к целому с помощью стандартных целочисленных преобразований ($$R.4.1). Например, в следующем фрагменте:

           enum color { red, yellow, green=20, blue };
           color col = red;
           color* cp = &col;
           if (*cp == blue ) // ...

color задан как целочисленный тип, описывающий разные цвета, col описан как объект этого типа, а cp как указатель на объект этого типа. Возможными значениями объекта типа color являются red, yellow, green, blue. Эти значения можно преобразовать в целые значения 0, 1, 20 и 21. Поскольку каждое перечисление - это отдельный тип, объекту типа color можно присваивать только значения типа color, например,

           color c = 1;    // ошибка: несоответствие типов
                           // нет преобразования от int в color

           int i = yellow; // нормально: yellow преобразуется в int со значением 1
                           // стандартное целочисленное преобразование

Обратитесь также к $$R.18.3.

Элементы перечисления, определенные в классе ($$R.9), относятся к области видимости этого класса, и к ним можно обращаться извне функций-членов этого класса только с помощью явного уточнения именем класса ($$R.5.1). Имя самого типа перечисления локально в этом классе ($$R.9.7), например,

           class X {
           public:
               enum direction { left='l', right='r' };
               int f(int i)
                   { return i==left ? 0 : i==right ? 1 : 2; }
           };

           void g(X* p)
           {
             direction d;        // ошибка: `direction' вне
             int i;              // области видимости
             i = p->f(left);     // ошибка: `left' тоже невидим
             i = p->f(X::right); // нормально
             // ...
           }

Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.