Вход/Регистрация
Справочное руководство по C++
вернуться

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

Шрифт:

{

 int i = p-›f; // теперь X::f внешнее связывание

 int j = p-›g;

 //…

}

inline int X::f // ошибка: вызов до определения

 // как inline

{

 //…

}

inline int X::g

{

 //…

}

inline int X::h // теперь X::h имеет внутреннее связывание

{

 //…

}

Спецификация virtual может использоваться только в описаниях нестатических функций-членов при описании класса (см. §R.10.2).

R.7.1.3 Спецификация typedef

Описания со спецификацией typedef задают идентификаторы, которые позднее могут использоваться для обозначения основных или производных типов. Спецификация typedef недопустима в определении-функции (§R.8.3).

имя-typedef:

 идентификатор

В пределах области видимости (§R.3.2) описания typedef любой идентификатор, появляющийся в части любого из описателей, становится синтаксически эквивалентным служебному слову и обозначает тип, связанный с данным идентификатором, как описано в §R.8. Таким образом, имя-typedef является синонимом другого типа. В отличие от описания класса (§R.9.1) имя-typedef не добавляет нового типа. Например, после описания

typedef int MILES, *KLICKSP;

конструкции

MILES distance;

extern KLICKSP metricp;

являются законными описаниями, тип distance есть int, а у metricp тип "указатель на int".

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

typedef struct s {/*… */} s;

typedef int I;

typedef int I;

typedef I I;

Безымянный класс, который определяется в typedef, получает в качестве своего имени имя, использованное в typedef, например,

typedef struct {/*… */} S; // имя структуры стало S

С помощью описания typedef нельзя переопределить имя типа, описанного в этой же области видимости, так, чтобы оно обозначало другой тип, например,

class complex {/*… */};

typedef int complex; // ошибка: переопределение

Аналогично, нельзя описывать класс с именем типа, описанного в этой же области видимости, так, чтобы он обозначал другой тип, например,

typedef int complex;

class complex {/*… */}; // ошибка: переопределение

Имя-typedef, которое обозначает класс, является именем-класса (§R.9.1). Синоним нельзя использовать после следующих префиксов: class, struct и union, а также в именах конструкторов и деструкторов в описании самого класса, например,

struct S {

 S;

 ~S;

};

typedef struct S T;

S a = T; // нормально

struct T* p; // ошибка

R.7.1.4 Спецификация шаблона типа

Спецификация шаблона типа используется для задания семейства типов или функций (см. §R.14).

R.7.1.5 Спецификация friend

Спецификация friend используется для задания доступа к членам класса (см. §R.11.4).

R.7.1.6 Спецификация типа

К спецификации типа относятся:

спецификация-типа:

 имя-простого-типа

 спецификация-класса

 спецификация-перечисления

 спецификация-сложного-типа

 :: имя-класса

 const

 volatile

При описании объекта служебные слова const и volatile можно добавить к любой законной спецификации-типа. Во всех других случаях в описании может присутствовать не более одной спецификации-типа. Объект со спецификацией const можно инициализировать, но его значение не должно изменяться в дальнейшем. Объект со спецификацией const, если только он не был явно описан как extern, не подлежит внешнему связыванию и должен инициализироваться (§R.8.4, §R.12.1). Целое со спецификацией const, инициализированное выражением-константой, может использоваться в выражении-константе (§R.5.19). Каждый элемент массива со спецификацией const имеет ту же спецификацию, а каждый нестатический член, не являющийся функцией, из объекта класса со спецификацией const сам считается const (§R.9.3.1). Объект типа без конструктора или деструктора, который имеет спецификацию const, может быть помещен в память, доступную только по чтению. Попытка записи в любую часть такого объекта или приведет к особой адресной ситуации, или пройдет бесследно, как если бы объект не имел спецификации const.

  • Читать дальше
  • 1
  • ...
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: