Справочное руководство по C++
Шрифт:
Спецификация virtual может использоваться только в описаниях нестатических функций-членов при описании класса (см. §R.10.2).
R.7.1.3 Спецификация typedef
Описания со спецификацией typedef задают идентификаторы, которые позднее могут использоваться для обозначения основных или производных типов. Спецификация typedef недопустима в определении-функции (§R.8.3).
В пределах области видимости (§R.3.2) описания typedef любой идентификатор, появляющийся в части любого из описателей, становится синтаксически эквивалентным служебному слову и обозначает тип, связанный с данным идентификатором, как описано в §R.8. Таким образом, имя-typedef является синонимом другого типа. В отличие от описания класса (§R.9.1) имя-typedef не добавляет нового типа. Например, после описания
конструкции
MILES distance;
являются законными описаниями, тип distance есть int, а у metricp тип "указатель на int".
С помощью typedef можно переопределить имя так, чтобы оно опять обозначало тип, на который уже ссылалось, причем даже в той области видимости, в которой тип был первоначально описан, например,
Безымянный класс, который определяется в typedef, получает в качестве своего имени имя, использованное в typedef, например,
С помощью описания typedef нельзя переопределить имя типа, описанного в этой же области видимости, так, чтобы оно обозначало другой тип, например,
Аналогично, нельзя описывать класс с именем типа, описанного в этой же области видимости, так, чтобы он обозначал другой тип, например,
Имя-typedef, которое обозначает класс, является именем-класса (§R.9.1). Синоним нельзя использовать после следующих префиксов: class, struct и union, а также в именах конструкторов и деструкторов в описании самого класса, например,
R.7.1.4 Спецификация шаблона типа
Спецификация шаблона типа используется для задания семейства типов или функций (см. §R.14).
R.7.1.5 Спецификация friend
Спецификация friend используется для задания доступа к членам класса (см. §R.11.4).
R.7.1.6 Спецификация типа
К спецификации типа относятся:
При описании объекта служебные слова const и volatile можно добавить к любой законной спецификации-типа. Во всех других случаях в описании может присутствовать не более одной спецификации-типа. Объект со спецификацией const можно инициализировать, но его значение не должно изменяться в дальнейшем. Объект со спецификацией const, если только он не был явно описан как extern, не подлежит внешнему связыванию и должен инициализироваться (§R.8.4, §R.12.1). Целое со спецификацией const, инициализированное выражением-константой, может использоваться в выражении-константе (§R.5.19). Каждый элемент массива со спецификацией const имеет ту же спецификацию, а каждый нестатический член, не являющийся функцией, из объекта класса со спецификацией const сам считается const (§R.9.3.1). Объект типа без конструктора или деструктора, который имеет спецификацию const, может быть помещен в память, доступную только по чтению. Попытка записи в любую часть такого объекта или приведет к особой адресной ситуации, или пройдет бесследно, как если бы объект не имел спецификации const.
Не существует не зависящего от реализации объяснения объектов со спецификацией volatile. Она служит подсказкой транслятору избегать слишком активной оптимизации, связанной с этим объектом, поскольку значение объекта может изменяться способами, скрытыми от транслятора. Каждый элемент массива со спецификацией volatile имеет ту же спецификацию и каждый нестатический член, не являющийся функцией, из объекта класса со спецификацией volatile сам считается volatile (§R.9.3.1).
Если спецификация-типа отсутствует в описании, она считается заданной как int.
Вместе с int нельзя задавать более одного служебного слова long или short. Они могут использоваться и поодиночке, тогда считается, что тип есть int. Служебное слово long может появиться вместе с double. Вместе с char, short, int или long нельзя задавать более одного служебного слова signed или unsigned. Они могут использоваться и поодиночке, тогда считается, что тип есть int. Спецификация signed указывает, что объекты типа char и битовые поля являются знаковыми, для других целочисленных типов эта спецификация избыточна.