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