спецификаторы_описания: спецификатор_описания спецификаторы_описания opt

спецификатор_описания: спецификатор_класса_памяти спецификатор_типа спецификатор_функции typedef friend

спецификатор_типа: простое_имя_типа спецификатор_класса спецификатор_enum усложненный_спецификатор_типа const

спецификатор_класса_памяти: auto extern register static

спецификатор_функции: inline overload virtual

усложненный_спецификатор_типа: ключ typedef-имя ключ идентификатор

ключ: class struct union enum

список_описателей: иниц-описатель иниц-описатель , список_описателей

иниц-описатель: описатель инициализатор opt

описатель: оп_имя ( описатель ) * const opt описатель amp; const opt описатель

описатель ( список_описаний_параметров ) описатель [ константное_выражение opt ]

оп_имя: простое_оп_имя typedef-имя :: простое_оп_имя

простое_оп_имя: идентификатор typedef-имя ~ typedef-имя имя_функции_операции имя_функции_преобразования

имя_функции_операции: operator операция

имя_функции_преобразования operator тип

список_описаний_параметров: список_описаний_прм opt ... opt

список_описаний_прм: список_описаний_прм , описание_параметра описание_параметра

описание_параметра: спецификаторы_описания описатель = выражение спецификаторы_описания описатель = константное_выражение спецификаторы_описания абстракт_описатель = выражение спецификаторы_описания абстракт_описатель = выражение

спецификатор_класса: заголовок_класса (* список_членов opt *) заголовок_класса (* список_членов opt public : список_членов opt *)

заголовок_класса: сост идентификатор opt сост идентификатор opt : public opt typedef-имя

список_членов: описание_члена список_членов opt

описание_члена: спецификаторы_описания opt описатель_члена инициализатор opt ; определение_функции opt

описатель_члена: описатель идентификатор opt : константное_выражение

инициализатор: = выражение = (* список_инициализаторов *) = (* список_инициализаторов , *) ( список_выражений )

список_инициализаторов: выражение список_инициализаторов , список_инициализаторов (* список_инициализаторов *)

спецификатор_enum: enum идентификатор opt (* enum-список *)

enum-список: перечислитель enum-список , перечислитель

перечислитель: идентификатор идентификатор = константное_выражение

14.3 Операторы

составной_оператор: (* список_операторов opt *)

список_операторов: оператор оператор список_операторов

оператор: описание составной_оператор выражение opt ; if ( выражение ) оператор if ( выражение ) оператор else оператор while ( выражение ) оператор do оператор while ( выражение ) ; for ( оператор выражение opt ; выражение opt ) оператор switch ( выражение ) оператор case константное_выражение : оператор default : оператор break ; continue ; return выражение opt ; goto идентификатор ; идентификатор : оператор

14.4 Внешние определения

программа: внешнее_определение внешнее_определение программа

внешнее_определение: определение_функции описание

определение_функции: спецификаторы_описания opt описатель_функции инициализатор_базового opt тело_функции

описатель_функции: описатель ( список_описаний_параметров )

тело_функции: составной_оператор

инициализатор_базового: : ( список_инициализаторов_членов opt )

14.5 Препроцессор

#define идентификатор строка_лексем

#define идентификатор( идентификатор,...,идентификатор ) строка лексем #else #endif #if выражение #ifdef идентификатор #ifndef идентификатор #include «имя_файла» #include «имя_файла» #line константа «имя_файла» #undef идентификатор

15. Отличия от C

15.1 Расширения

Типы параметров функции могут быть заданы (#8.4) и будут проверяться (#7.1). Могут выполняться преобразования типов (# 7.1).

Для выражений с числами с плавающей точкой может исползоваться плавающая арифметика одинарной точности; #6.2.

Имена функций могут быть перегружены; #8.9.

Операции могут быть перегружены; 7.16, #8.5.11.

Функции могут быть inline-подставляемыми; #8.1.

Объекты данных могут быть константными (const); #8.3.

Могут быть описаны объекты ссылочного типа; #8.4, #8.6.3

Операции new и delete обеспечивают свободное хранение в памяти, #7.2.

Классы могут обеспечивать сокрытие данных (#8.5.9), грантированную инициализацию (#8.6.2), определяемые пользовтелем преобразвания (#8.5.6), и динамическое типизирование через использование виртуальных функций (#8.5.4).

Имя класса или перечисления является именем типа; #8.5.

Любой указатель может присваиваться void* без применеия приведения к типу; #7.14.

Описание внутри блока является оператором; #9.14.

Можно описывать безымянные объединения; #8.5.13.

15.2 Сводка Несовместимостей

Большинство конструкций C допустимы в С++ без изменения их смысла. Исключения из этого следующие:

Программы, использующие одно из новых ключевых слов

class const delete friend inline new operator overload public signed this virtual volatile

как идентификаторы, недопустимы.

Описание функции f(); означает, что f не получает парметров, в C же это значит, что f может получать параметр свершенно любого типа.

В C внешнее имя может определяться несколько раз, а в С+ + оно должно быть определено ровно один раз.

Имена классов в С++ находятся в том же пространстве, что и прочие имена, поэтому конструкции вроде

int s; struct s (* /* ... */ *); f() (* s = 1; *)

использоваться не могут. Однако, для разрешения болшинства конфликтов может применяться явное использование class, struct, union, enum (#8.2) или :: (#7.1). Например:

int s; struct s (* /* ... */ *); void f() (*int s; struct s a; *) void g() (* ::s = 1; *)

15.3 Анахронизмы

Изложенные здесь расширения могут предоставляться для того, чтобы упростить использование C программ как С++ прорамм. Обратите внимание, что каждая из этих возможностей сдержит нежелательные аспекты. Предоставляющая их реализация должна также обеспечивать пользователю способ удостовериться, что они не встречаются в исходном файле.

Вы читаете C++
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату