Читать «Справочное руководство по C++» онлайн - страница 37

Бьярн Страустрап

 class

 struct

 union

Если задан идентификатор, спецификация-сложного-типа описывает его как имя-класса (см. §R.9.1).

Если определено имя, которое описывается с помощью спецификации union, то оно должно быть определено как объединение. Если определено имя, которое описывается с помощью спецификации class, то оно должно быть определено с помощью спецификаций class или struct. Если определено имя, которое описывается с помощью спецификации struct, оно должно быть определено с помощью спецификации class или struct. Имена вложенных типов (§R.9.7) должны уточняться именем объемлющего класса:

уточненное-имя-типа:

 имя-typedef

 имя-класса :: уточненное-имя-типа

полное-имя-класса:

 уточненное-имя-класса

 :: уточненное-имя-класса

уточненное-имя-класса:

 имя-класса

 имя-класса :: уточненное-имя-класса

Имя, уточненное именем-класса должно быть типом, определенным в этом классе или в базовом классе этого класса. Как обычно, имя, описанное в производном классе, делает невидимыми члены с этим именем из базовых классов (см. §R.3.2).

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). Например, в следующем фрагменте: