Категории
Самые читаемые
RUSBOOK.SU » Компьютеры и Интернет » Программирование » Справочное руководство по C++ - Бьярн Страустрап

Справочное руководство по C++ - Бьярн Страустрап

Читать онлайн Справочное руководство по C++ - Бьярн Страустрап

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 2 3 4 5 6 7 8 9 10 ... 41
Перейти на страницу:

Если за обратной дробной чертой следует символ, отличный от перечисленных, результат неопределен. Комбинация ooo состоит из обратной дробной черты, а которой следуют одна, две или три восьмеричные цифры. Считается, что они определяют значение искомого символа. Комбинация xhhh состоит из из обратной дробной черты, за которой следует x, а за ним, в свою очередь, следует последовательность шестнадцатеричных цифр. Считается, что она задает значение искомого символа. Нет ограничения на длину этой последовательности шестнадцатеричных цифр. Последовательность восьмеричных или шестнадцатеричных цифр оканчивается, когда встречается первый символ, который не есть восьмеричная или шестнадцатеричная цифра соответственно. Если значение символьной константы превосходит максимальное из char, то оно определяется реализацией.

Символьная константа, которой непосредственно предшествует буква L, является широкой символьной константой, например, L'ab'. Такие константы имеют тип wchar_t, являющийся целочисленным типом (§R.3.6.1), определенном в стандартном заголовочном файле ‹stddef.h›. Широкие символы предназначены для такого набора символов, где значение символа не помещается в один байт.

R.2.5.3 Константы с плавающей точкой

Константы с плавающей точкой состоят из целой части, символа точка, дробной части, e или E, целого показателя с возможным знаком и возможным окончанием, указывающим тип. Целая и дробная части состоят из последовательности десятичных (основание счисления десять) цифр. Или целая часть, или дробная часть (но не обе) могут отсутствовать. Или точка, или символ e (или E) вместе с показателем могут отсутствовать (но не оба). Тип константы с плавающей точкой есть double, если только он не задан явно с помощью окончания. Окончания f или F задают тип float, окончания l или L задают тип long double.

R.2.5.4 Строки литералов

Строка литералов есть последовательность символов (как они определены в §R.2.5.2), заключенная в двойные кавычки, т.е. "…". Строка имеет тип "массив символов" и класс памяти static (§R.3.5), она инициализируется заданными символами. Будут ли все строки различны (т.е. хранится в отдельных объектах), определяется реализацией.

Соседние строки литералов конкатенируются. Символы в строках, полученных при конкатенации, хранятся отдельно. Например, после конкатенации

"xA" "B"

строка будет содержать два символа 'xA' и 'B' (а не один шестнадцатеричный символ 'xAB').

После всех необходимых конкатенаций к строке добавляется символ '', чтобы программа, читающая строку, могла определить ее конец. Размер строки равен числу всех ее символов, включая символ завершитель строки. Внутри строки перед символом двойной кавычки " должен идти символ .

Строка литералов, перед которой непосредственно идет символ L, считается широкосимвольной строкой, например, L"asdf". Такая строка имеет тип "массив элементов типа wchar_t", где wchar_t целочисленный тип, определенный в стандартном заголовочном файле ‹stddef.h›. Результат конкатенации обычных и широкосимвольных строк литералов неопределен.

R.3 Основные понятия

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

Объект имеет область для его хранения (§R.3.7). Поименованный объект имеет класс памяти (§R.3.5), который определяет его время жизни. Интерпретация значений, хранящихся в объекте, определяется типом выражения, задающего доступ к объекту.

R.3.1 Описания и определения

Описание ($$r.7) делает известным в программе одно или несколько имен. Описание считается определением, если только оно не описывает функцию без задания ее тела (§R.8.3), не содержит описателя extern (§R.7.11), не имеет части инициализации или тела функции, не является описанием статического члена данных в описании класса (§R.9.4), не является описанием имени класса (§R.9.1), не является описанием typedef (§R.7.1.3). Ниже приведены примеры определений:

int a;

extern const c = 1;

int f(int x) { return x+a; }

struct S { int a; int b; };

enum { up, down };

тогда как ниже следуют только описания:

extern int a;

extern const c;

int f(int);

struct S;

typedef int Int;

Для каждого объекта, функции, класса и элемента перечисления, используемых в программе, должно быть только одно определение (§R.3.3). Если функция никогда не вызывается и ее адрес никогда не используется, ее не нужно определять. Аналогично, если имя класса используется только так, что не требуется знать определения класса, то такой класс не надо определять.

R.3.2 Область видимости

Существует четыре области видимости: локальная, функция, файл и класс.

Локальная: Имя, описанное в блоке (§R.6.3), является локальным в этом блоке и может использоваться только в нем и в блоках, содержащихся в этом блоке и появляющихся после момента описания. Имена формальных параметров рассматриваются, как если бы они были описаны в самом объемлющем блоке этой функции.

Функция: Метки (§R.6.1) можно использовать повсюду в функции, в которой они описаны. Только метки имеют область видимости, совпадающую с функцией.

Файл: Имя описанное вне всех блоков (§R.6.3) и классов (§R.9) имеет область видимости файл и может быть использовано в единице трансляции, в которой оно появляется после момента описания. Имена, описанные с файловой областью видимости, называются глобальными.

Класс: Имя члена класса является локальным в своем классе и оно может быть использовано только в функции-члене этого класса (§R.9.3), или после операции., применяемой к объекту данного класса (§R.5.2.4) или объекту производного класса(§R.10), или после операции -›, применяемой к указателю на объект данного класса (§R.5.2.4) или на объект производного класса, или после операции разрешения:: (§R.5.1), примененной к имени данного или производного класса. Имя, введенное с помощью операции friend (§R.11.4), принадлежит той же области определенности, что и класс, содержащий описание friend. Класс, впервые описанный в операторе return или в типе параметра, принадлежит к глобальной области видимости.

Специальные соглашения действуют на имена, введенные при описании параметров функции (§R.8.2.5) и в описаниях friend (§R.11.4).

Имя может быть скрыто явным описанием того же имени в объемлющем блоке или классе. Скрытое имя члена класса все-таки можно использовать, если оно предваряется именем класса, к которому применена операция:: (§R.4.1, §R.9.4, §R.10). Скрытое имя объекта, функции, типа или элемента перечисления с файловой областью видимости можно использовать, если оно предваряется унарной операцией :: (§R.5.1). В дополнении к этому, имя класса (§R.9.1) может быть скрыто именем объекта, функции или элемента перечисления, имеющего ту же область видимости. Если класс и объект, или функция, или элемент перечисления описаны (в любом порядке) с одинаковым именем в одной области видимости, то имя класса становится скрытым. Имя класса, скрытое в локальной области видимости или в области видимости класса именем объекта, функции или элемента перечисления, все-таки можно использовать, если предварить его подходящей спецификацией class, struct или union (§R.7.1.6). Аналогично, скрытое имя элемента перечисления можно использовать, если предварить его спецификацией типа enum (§R.7.1.6). В §R.10.4 приводится сводка правил области видимости. Моментом описания имени считается момент завершения описателя имени (§R.8), предшествующей части инициализации (если она есть).

Например,

int x = 12;

{ int x = x; }

Здесь второе x инициализируется своим собственным (неопределенным) значением.

Моментом описания элемента перечисления считается момент сразу после появления его идентификатора, например:

enum { x = x };

Здесь элемент перечисления x опять инициализируется своим собственным (неопределенным) значением.

R.3.3 Программа и связывание

Программа состоит из одного или нескольких файлов, связываемых вместе (§R.2). Файл состоит из последовательности описаний.

Имя с файловой областью видимости, которое явно описано как static, является локальным в своей единице трансляции и может использоваться для именования объектов, функций и т.п. в других единицах трансляции. Говорят, что такие имена имеют внутреннее связывание. Имя с файловой областью видимости, которое явно описано со спецификацией inline, является локальным в своей единице трансляции. Имя с файловой областью видимости, которое явно описано со спецификацией const и не описано явно как extern, считается локальным в своей единице трансляции. То же верно для имени класса, которое не использовалось в нелокальных для данной единицы трансляции описаниях объекта, функции или класса, и который не имеет статических членов (§R.9.4), не имеет функций-членов, кроме подстановок (§R.9.3.2). Всякое описание некоторого имени с файловой областью видимости, которое не описано одним из перечисленных способов так, чтобы иметь внутреннее связывание, в многофайловой программе обозначает один и тот же объект (§R.3.7), функцию (§R.8.2.5) или класс (§R.9). Такие имена называются внешними или говорят, что они имеют внешнее связывание. В частности, поскольку нельзя описать имя класса как static, всякое употребление имени некоторого класса с файловой областью видимости, который (класс) использовался для описания объекта или функции с внешним связыванием, или же который имеет статический член или функцию-член, не являющуюся подстановкой, будет обозначать один и тот же класс.

1 2 3 4 5 6 7 8 9 10 ... 41
Перейти на страницу:
На этой странице вы можете бесплатно скачать Справочное руководство по C++ - Бьярн Страустрап торрент бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Вася
Вася 24.11.2024 - 19:04
Прекрасное описание анального секса
Сергій
Сергій 25.01.2024 - 17:17
"Убийство миссис Спэнлоу" от Агаты Кристи – это великолепный детектив, который завораживает с первой страницы и держит в напряжении до последнего момента. Кристи, как всегда, мастерски строит