R.18.1 Расширения
В этом разделе перечисляются основные расширения языка С, введенные
в С++.
R.18.1.1 Возможности С++, введенные в 1985 г.
Здесь перечисляются возможности, добавленные к С, версией языка
С++ 1985 г.
Можно указывать типы формальных параметров функции ($$R.8.2.5), и они
будут проверяться ($$R.5.2.2). Будет происходить преобразование
типа ($$R.5.2.2). Это есть и в ANSI C.
В выражениях со значениями типа float вычисления могут проходить
с обычной точностью ($$R.3.6.1 и $$R.4.3). Это есть и в ANSI C.
Можно перегружать имена функций; $$R.13.
Можно перегружать операции; $$R.13.4
Возможна реализация вызова функций подстановкой; $$R.7.1.2.
Можно описывать объекты, представляющие данные, со спецификацией
const; $$R.7.1.6. Это есть и в ANSI C.
Можно описывать типа ссылки; $$R.8.2.2 и $$R.8.4.3.
Возможно управление свободной памятью с помощью операций new и
delete; $$R.5.3.3 и $$R.5.3.4.
Введены классы, которые позволяют: скрывать информацию ($$R.11),
проводить инициализацию ($$R.12.1), осуществлять пользовательские
преобразования типа ($$R.12.3) и работать с динамическими типами
с помощью виртуальных функций ($$R.10.2).
Имя класса или перечисления считается именем типа; $$R.9.
Указатель на любой объект c типом, не являющимся const или volatile,
можно присвоить указателю типа void*. Это есть и в ANSI C.
Указатель на функцию можно присваивать указателю типа void*;
$$R.4.6.
Описание внутри блока считается оператором; $$R.6.7.
Можно описывать безымянные объединения; $$R.9.5.
R.18.1.2 Возможности, добавленные в С++ после 1985 г.
Здесь перечисляются основные расширения С++ после 1985 г.:
Класс может иметь более одного прямого базового класса
(множественное наследование); $$R.10.1.
Члены класса могут быть защищенными; $$R.11.
Операции new и delete можно описывать в классе и перегружать;
$$r.5.3.3, $$R.5.3.4, $$R.12.5. Это позволило определенный способ
управления памятью для класса с помощью "присваивания указателю
this" отнести в раздел анахронизмов; $$R.18.3.3.
Можно явно уничтожать объекты; $$R.12.4.
Присваивания и инициализация для класса определены как присваивание и
инициализация по членам; $$R.12.8.
Служебное слово overload стало излишним и отнесено к разделу
анахронизмов; $$R.18.3.
Произвольные выражения разрешены в качестве инициализаторов статических
объектов; $$R.8.4.
Объекты, представляющие данные, могут быть volatile; $$R.7.1.6.
Также и в ANSI C.
Допустимы инициализаторы для статических членов класса; $$R.9.4.
Функции-члены могут быть статическими; $$R.9.4.
Функции-члены могут быть const или volatile; $$R.9.3.1.
Можно явно указать связывание с подпрограммами на других языках;
$$R.7.4.
Можно перегружать операции ->, ->* и ` ; $$R.13.4.
Классы могут быть абстрактными; $$R.10.3.
Для пользовательских типов префиксные и постфиксные операции
различаются.
Шаблоны типов; $$R.14.
Управление особыми ситуациями; $$R.15.
R.18.2 С++ и ANSI C
Вообще язык С++ обладает большими возможностями и налагает меньше
ограничений, чем ANSI C, поэтому большинство конструкций ANSI C
являются законными для С++, причем смысл их не меняется. Исключения
сводится к следующему:
Любая программа на ANSI C, использующая в качестве идентификаторов
следующие служебные слова С++, не является программой на С++; $$R.2.4:
asm catch class delete friend
inline new operator private protected
public template try this virtual
throw
Хотя это считается устаревшем в ANSI C, реализация С может налагать
драконовские ограничения на длину идентификаторов; в реализациях С++
это недопустимо; $$R.2.3.
В С++ функция должна быть описана прежде, чем ее можно вызвать;
$$R.5.2.2.
Описание f(); в С++ означает, что функция f не имеет параметров
($$R.8.2.5), а в С это означает, что f может иметь любое число
параметров любого типа. Такое описание считается устаревшим в ANSI C.
В ANSI C можно несколько раз описать без спецификации extern глобальный
объект данных, в С++ возможно только одно его определение; $$R.3.3
В С++ класс не может иметь тоже имя, что и имя typedef, относящееся
в той же области видимости к другому типу; $$R.9.1.
В ANSI C операнд типа void* можно использовать в правой части
присваивания, а также при инициализации переменной типа указателя на
произвольный тип; в С++ это невозможно $$R.7.1.6.
В ANSI C возможны команды переходов, обходящие инициализацию;
в С++ это невозможно.
В ANSI C по умолчанию глобальный объект типа const подлежит
внешнему связыванию; для С++ это не так; $$R.3.3.
Определения функций в "старом" стиле и вызовы неописанных функций
считаются в С++ анахронизмами, которые не обязательно должны
поддерживаться любой реализацией; $$R.18.3.1. В ANSI C они просто
считаются устаревшими.
В С++ структура (struct) образует область видимости ($$R.3.2);
В ANSI C структура, перечисление или элемент перечисления,
описанные в структуре поднимаются в область видимости самой
структуры.
Присваивание объекту типа перечисления значения, не принадлежащего
перечислению, считается в С++ анахронизмом и не должно поддерживаться
во всех реализациях; $$R.7.2. В ANSI C рекомендуется для таких
присваиваний выдавать предупреждение.
Строки, инициализирующие символьные массивы, не могут быть длиннее
этих массивов; $$R.8.4.2.
Тип символьной константы в С++ есть char ($$R.2.5.2) и int в
ANSI C.
Тип элемента перечисления есть тип этого перечисления в С++ ($$R.7.2)
и тип int в ANSI C.
Кроме того, стандарт ANSI для С допускает значительные различия в
допустимых реализациях языка, что может привести к еще большим расхождениям
между реализациями С++ и С. В частности, в некоторых реализациях С
могут быть допустимы некоторые несовместимые описания. В С++ требуется
совместимость даже для разных единиц трансляции; $$R.3.3.
- * Справочное руководство r.1 Введение
- R.1.1 Обзор
- R.1.2 Запись синтаксиса
- R.2 Соглашения о лексических понятиях
- R.2.1 Лексемы
- 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.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.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.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.2.1 Как бороться с расхождениями
- R.18.3 Анахронизм
- R.18.3.1 Определения функций старого стиля
- R.18.3.4 Приведение указателей на функцию-член
- R.18.3.5 Невложенность классов
- Список служебных слов
- Указатель
- * Примеры *