Справочное руководство по C++ | Страница 1 | Онлайн-библиотека


Выбрать главу

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

Второе дополненное издание

* СПРАВОЧНОЕ РУКОВОДСТВО

R.1 Введение

Это справочное руководство описывает язык программирования C++ по состоянию на май 1991. C++ - язык программирования общего назначения, базирующийся на языке программирования С.

В дополнение к возможностям С язык C++ предоставляет классы, функции подстановки, перегрузку операций, перегрузку имен функций, постоянные типы, ссылки, операторы управления свободной памятью, проверку параметров функций и приведение типов. Все расширения С суммируются в §R.18.1. Различия между C++ и ANSI C++ приведены в §R.18.2.

Расширения C++ версии 1985 года до данного описания суммируются в §R.18.1.2. Разделы, относящиеся к шаблонам типа (§R.14) и управлению особыми ситуациями (§R.15), являются местами планируемых расширений языка.

R.1.1 Обзор

Это руководство содержит следующее:

1. Введение.

2. Соглашения о лексических понятиях.

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

4. Стандартные преобразования.

5. Выражения.

6. Операторы.

7. Описания.

8. Описатели.

9. Классы.

10. Производные классы.

11. Контроль доступа к членам.

12. Специальные функции-члены.

13. Перегрузка.

14. Шаблоны типов.

15. Управление особыми ситуациями.

16. Препроцессорная обработка.

Приложение A: Сводка синтаксиса

Приложение B: Совместимость

R.1.2 Запись синтаксиса

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

{выражениеopt}

означает необязательное выражение, заключенное в фигурные скобки.

R.2 Соглашения о лексических понятиях

Программа на C++ состоит из одного или нескольких файлов (§R.3.3). С логической точки зрения файл транслируется за несколько проходов. Первый проход состоит в препроцессорной обработке (§R.16), на которой происходит включение файлов и макроподстановка. Работа препроцессора управляется с помощью команд, являющихся строками, первый символ которых отличный от пробела есть # ($$R2.1). Результат работы препроцессора есть последовательность лексем. Такую последовательность лексем, т.е. файл после препроцессорной обработки, называют единицей трансляции.

R.2.1 Лексемы

Существуют лексемы пяти видов: идентификаторы, служебные слова, литералы, операции и различные разделители. Пробелы, вертикальная и горизонтальная табуляция, конец строки, перевод строки и комментарии (все вместе "обобщенные" пробелы), как указано ниже, игнорируются, за исключением того, что они отделяют лексемы. Обобщенные пробелы нужны, чтобы разделить стоящие рядом идентификаторы, служебные слова и константы.

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

R.2.2 Комментарии

Символы /* начинают комментарий, который завершается символами */. Такие комментарии не могут быть вложенными. Символы // начинают комментарий, который завершается концом этой строки. Символы //, /* и */ не имеют специального назначения в комментарии // и рассматриваются как обычные символы. Аналогично символы // и /* не имеют специального назначения внутри комментария /*.

R.2.3 Идентификаторы

Идентификатор - это последовательность букв и цифр произвольной длины. Первый символ должен быть буквой, символ подчеркивания _ считается буквой. Прописные и строчные буквы различаются. Все символы существенны.

R.2.4 Служебные слова

Перечисленные ниже идентификаторы фиксируются как служебные слова и в другом смысле не могут использоваться:

asm        continue     float    new          signed      try

auto       default      for      operator     sizeof      typedef

break      delete       friend   private      static      union

case       do           goto     protected    struct      unsigned

catch      double       if       public       switch      virtual

char       else         inline   register     template    void

class      enum         int      return       this        volatile

const      extern       long     short        throw       while

В дополнение к этому идентификаторы, содержащие двойное подчеркивание (__) резервируются для реализаций C++ и стандартных библиотек и пользователи не должны употреблять их.

В представлении программы на C++ в кодировке ASCII используются в качестве операций или разделителей следующие символы:

! % ^ & * ( ) - + = {} | ~

[ ] \ ;  ': " ‹ › ? , . /

а следующие комбинации символов используются для задания операций:

-› ++ -- .* -›* ‹‹ ›› ‹= ›= == != &&

|| *= /= %= += -= ‹‹= ››= &= ^= |= ::

Каждая операция считается отдельной лексемой.

В дополнении к этому следующие символы резервируются для препроцессора:

# ##

Определенные, зависящие от реализации, свойства, такие как тип операции sizeof ($$R5.3.2) или диапазоны базовых типов (§R.3.6.1) определяются в стандартных заголовочных файлах (§R.16.4)

‹float.h› ‹limits.h› ‹stddef.h›

Эти файлы являются частью ANSI стандарта для С. Кроме того заголовочные файлы

‹new.h› ‹stdarg.h› ‹stdlib.h›

определяют типы самых важных библиотечных функций. Два последних файла входят в ANSI стандарт для С, файл ‹new.h› относится только к С++.

R.2.5 Литералы

Есть несколько видов литералов (часто называемых "константами").

литерал:

 целая константа

 символьная константа

 константа с плавающей точкой

 строка литералов

R.2.5.1 Целые константы

Все целые константы, состоящие из последовательности цифр, считаются десятичными (основание счисления десять), если только они не начинаются с 0 (цифра ноль). Последовательность цифр, начинающаяся с 0, считается восьмеричным целым (основание счисления восемь). Цифры 8 и 9 не являются восьмеричными. Последовательность цифр, начинающаяся с 0x или 0X, считается шестнадцатеричным целым (основание счисления шестнадцать). Шестандцатеричные цифры могут состоять из символов от a или A до f или F с десятичными значениями их от десяти до пятнадцати. Например, число двенадцать можно записать как 12, 014 или 0XC.

Тип целой константы определяется ее представлением, значением и окончанием. Если она десятичная и не имеет окончания, ее тип будет первым подходящим для ее значения из следующих типов: int, long int, unsigned long int. Если она восьмеричная или шестнадцатеричная и не имеет окончания, ее тип будет первым подходящим для ее значения из следующих: int, unsigned int, long int, unsigned long int. Если она оканчивается символом u или U, ее тип будет первым подходящим для ее значения из следующих: unsigned int, unsigned long int. Если она оканчивается символом l или L, ее тип будет первым подходящим для ее значения из следующих: long int, unsigned long int. Если она оканчивается на ul, lu, uL, Lu, Ul, lU, UL или LU, ее типом будет unsigned long int.

R.2.5.2 Символьные константы

Символьной константой является один или несколько символов, заключенные в одиночные кавычки, например 'x'. Константа из одного символа имеет тип char. Значение константы из одного символа есть порядковый номер символа в таблице кодировки символов на данной машине. Символьные константы из нескольких символов имеют тип int. Значение такой константы зависит от реализации. Некоторые символы, не имеющие графического представления, как одиночная кавычка ', двойная кавычка ", знак вопроса ?, обратная дробная черта \, можно представлять комбинацией символов (начинающейся с \) в соответствии с приводимой ниже таблицей:

конец строки NL (LF) \n
горизонтальная табуляция HT \t
вертикальная табуляция VT \v
шаг назад BS \b
возврат каретки CR \r
перевод формата (авторегистр) FF \f
сигнал BEL \a
обратная дробная черта \ \\
знак вопроса ? \?
одиночная кавычка ' \'
двойная кавычка " \"
восьмеричное число ooo \ooo
шестнадцатеричное число hhh \xhhh
1
Бьярн Страустрап. Справочное руководство по C++: Второе дополненное издание: * СПРАВОЧНОЕ РУКОВОДСТВО 1
R.1 Введение 1
R.1.1 Обзор 1
R.1.2 Запись синтаксиса 1
R.2 Соглашения о лексических понятиях 1
R.2.1 Лексемы 1
R.2.2 Комментарии 1
R.2.3 Идентификаторы 1
R.2.4 Служебные слова 1
R.2.5 Литералы 1
R.2.5.1 Целые константы 1
R.2.5.2 Символьные константы 1
R.2.5.3 Константы с плавающей точкой 2
R.2.5.4 Строки литералов 2
R.3 Основные понятия 2
R.3.1 Описания и определения 2
R.3.2 Область видимости 2
R.3.3 Программа и связывание 2
R.3.4 Начало и окончание программы 3
R.3.5 Классы памяти 3
R.3.6 Типы 3
R.3.6.1 Основные типы 3
R.3.6.2 Производные типы 4
R.3.6.3 Имена типов 4
R.3.7 Адреса 4
R.4 Стандартные преобразования 4
R.4.1 Стандартные преобразования для целочисленных 4
R.4.2 Преобразования целочисленных 4
R.4.3 Значения с плавающей точкой и двойной точностью 4
R.4.4 Целочисленные и числа с плавающей точкой 4
R.4.5 Арифметические преобразования 4
R.4.6 Преобразования указателей 4
R.4.7 Преобразования ссылок 5
R.4.8 Указатели на члены 5
R.5 Выражения 5
R.5.1 Первичные выражения 5
R.5.2 Постфиксные выражения 6
R.5.2.1 Индексация 6
R.5.2.2 Вызов функции 6
R.5.2.3 Явные преобразования типа 6
R.5.2.4 Доступ к члену класса 6
R.5.2.5 Инкремент и декремент 6
R.5.3 Унарные операции 6
R.5.3.1 Инкремент и декремент 6
R.5.3.2 Операция sizeof 7
R.5.3.3 Операция new 7
R.5.3.4 Операция delete 7
R.5.4 Явное преобразование типа 8
R.5.5 Операции указатель-на-член 8
R.5.6 Мультипликативные операции 8
R.5.7 Аддитивные операции 9
R.5.8 Операции сдвига 9
R.5.9 Операции отношения 9
R.5.10 Операции сравнения на равенство 9
R.5.11 Поразрядная операция И 9
R.5.12 Поразрядная (исключающая) операция ИЛИ 9
R.5.13 Поразрядная (включающая) операция ИЛИ 9
R.5.14 Логическая операция И 9
R.5.15 Логическая операция ИЛИ 9
R.5.16 Операция условия 9
R.5.17 Операции присваивания 10
R.5.18 Операция запятая 10
R.5.19 Выражения-константы 10
R.6 Операторы 10
R.6.1 Помеченный оператор 10
R.6.2 Оператор-выражение 10
R.6.3 Составной оператор или блок 10
R.6.4 Выбирающий оператор 10
R.6.4.1 Оператор if 10
R.6.4.2 Оператор переключателя 11
R.6.5 Операторы цикла 11
R.6.5.1 Оператор while 11
R.6.5.2 Оператор do 11
R.6.5.3 Оператор for 11
R.6.6 Операторы перехода 11
R.6.6.1 Оператор break 11
R.6.6.2 Оператор continue 11
R.6.6.3 Оператор return 11
R.6.6.4 Оператор goto 11
R.6.7 Оператор описания 11
R.6.8 Разрешение неоднозначности 12
R.7 Описания 12
R.7.1 Спецификации 12
R.7.1.1 Спецификации класса памяти 12
R.7.1.2 Спецификации функций 12
R.7.1.3 Спецификация typedef 13
R.7.1.4 Спецификация шаблона типа 13
R.7.1.5 Спецификация friend 13
R.7.1.6 Спецификация типа 13
R.7.2 Описание перечисления 13
R.7.3 Описания asm 14
R.7.4 Спецификации связи 14
R.8 Описатели 14
R.8.1 Имена типов 14
R.8.1.1 Устранение неоднозначности 15
R.8.2 Смысл описателей 15
R.8.2.1 Указатели 15
R.8.2.2 Ссылки 15
R.8.2.3 Указатели на члены 15
R.8.2.4 Массивы 15
R.8.2.5 Функции 16
R.8.3 Определения функций 16
R.8.4 Инициализаторы 16
R.8.4.1 Агрегат 16
R.8.4.2 Символьные массивы 17
R.8.4.3 Ссылки 17
R.9 классы 17
R.9.1 Имена класса 17
R.9.2 Члены класса 18
R.9.3 Функции-члены 18
R.9.3.1 Указатель this 18
R.9.3.2 Функции-члены со спецификацией inline 19
R.9.4 Статические члены 19
R.9.5 Объединения 19
R.9.6 Битовые поля 19
R.9.7 Вложенные описания классов 19
R.9.8 Описания локальных классов 20
R.9.9 Имена локальных типов 20
R.10 Производные классы 20
R.10.1 Множественные базовые классы 20
R.10.1.1 Неоднозначности 20
R.10.2 Виртуальные функции 21
R.10.3 Абстрактные классы 21
R.10.4 Сводка правил области видимости 22
R.11 Контроль доступа к членам 22
R.11.1 Спецификации доступа 22
R.11.2 Спецификации доступа для базовых классов 22
R.11.3 Описания доступа 22
R.11.4 Друзья 23
R.11.5 Доступ к защищенным членам 23
R.11.6 Доступ к виртуальным функциям 23
R.11.7 Множественный доступ 23
R.12 Специальные функции-члены 23
R.12.1 Конструкторы 23
R.12.2 Временные объекты 24
R.12.3 Преобразования 24
R.12.3.1 Преобразование с помощью конструктора 24
R.12.3.2 Функции преобразования 24
R.12.4 Деструкторы 24
R.12.5 Свободная память 25
R.12.6 Инициализация 25
R.12.6.1 Явная инициализация 25
R.12.6.2 Инициализация членов и базовых классов 26
R.12.7 Конструкторы и деструкторы 26
R.12.8 Копирование объектов класса 26
R.13 Перегрузка 27
R.13.1 Сопоставление описаний 27
R.13.2 Сопоставление параметров 27
R.13.3 Адрес перегруженной функции 28
R.13.4 Перегруженные операции 28
R.13.4.1 Унарные операции 28
R.13.4.2 Бинарные операции 29
R.13.4.3 Присваивания 29
R.13.4.4 Вызов функции 29
R.13.4.5 Индексация 29
R.13.4.6 Доступ к члену класса 29
R.13.4.7 Инкремент и декремент 29
R.14 ШАБЛОНЫ ТИПА 29
R.14.1 Шаблоны типа 29
R.14.2 Шаблоны типов для классов 29
R.14.3 Эквивалентность типов 29
R.14.4 Шаблоны типа для функций 29
R.14.5 Описания и определения 30
R.14.6 Функции-члены шаблонов типа 30
R.14.7 Друзья 30
R.14.8 Статические члены и переменные 30
R.15 Обработка особых ситуаций 30
R.15.1 Обработка особых ситуаций 30
R.15.2 Запуск особой ситуации 30
R.15.3 Конструкторы и деструкторы 31
R.15.4 Обработка особой ситуации 31
R.15.5 Спецификации особых ситуаций 31
R.15.6 Специальные функции 31
R.15.6.1 Функция terminate() 31
R.15.6.2 Функция unexpected() 31
R.15.7 Особые ситуации и правила доступа 31
R.16 Препроцессорная обработка 32
R.16.1 Фазы препроцессорной обработки 32
R.16.2 Триграфные последовательности 32
R.16.3 Макроопределение и макроподстановка 32
R.16.3.1 Операция # 32
R.16.3.2 Операция ## 32
R.16.3.3 Повторный просмотр и дальнейшие подстановки 32
R.16.3.4 Область видимости макроимен и конструкция #undef 32
R.16.4 Включение файлов 33
R.16.5 Условная трансляция 33
R.16.6 Управление строками 33
R.16.7 Команда error 33
R.16.8 Команда pragma 33
R.16.9 Пустая директива 33
R.16.10 Предопределенные макроимена 33
R.17 Приложение A: Сводка грамматики 33
R.17.1 Служебные слова 33
R.17.2 Выражения 34
R.17.3 Описания 34
R.17.4 Описатели 34
R.17.5 Описания класса 35
R.17.6 Операторы 35
R.17.7 Препроцессор 35
R.17.8 Шаблоны типа 35
R.17.9 Обработка особых ситуаций 35
R.18 Приложение B: Совместимость 35
R.18.1 Расширения 35
R.18.1.1 Возможности С++, введенные в 1985 г. 35
R.18.1.2 Возможности, добавленные в C++ после 1985 г. 36
R.18.2 C++ и ANSI C 36
R.18.2.1 Как бороться с расхождениями 36
R.18.3 Анахронизм 36
R.18.3.1 Определения функций старого стиля 36
R.18.3.2 Старый стиль задания инициализатора базового класса 37
R.18.3.3 Присваивание указателю this 37
R.18.3.4 Приведение указателей на функцию-член 37
R.18.3.5 Невложенность классов 37
Список служебных слов 37
* ПРИМЕРЫ * 37
b1_1_1.cxx 37
b1_1_3.cxx 37
b1_4_5v.cxx 37
b1_5.cxx 37
b1__13.cxx 37
b1__14.cxx 37
b1__16.cxx 38
b2_1_3.cxx 38
b2_3.cxx 38
b2_3_6a.cxx 38
b2_3_6b.cxx 38
b2_3_7.cxx 38
b2_3__10.cxx 38
b3_1all.cxx 38
b3_2_6a.cxx 38
b3_2_6b.cxx 38
b4_6_8.cxx 38
b4_6_9.cxx 38
b5_3_2.cxx 39
b5_4_5.cxx 39
b5_5_3.cxx 39
b6_3_2.cxx 39
b6_6.cxx 39
b6_7.cxx 39
b6_8.cxx 39
b6_9.cxx 39
b7_2_8.cxx 40
b7_7.cxx 40
b8_3_3.cxx 40