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.18.2.1 Как бороться с расхождениями В общем случае программа на С++ использует многие возможности, отсутствующие в ANSI C. Для такой программы незначительные расхождения, перечисленные в $$R.18.2, явно перекрываются расширениями в С++. Когда С++ и ANSI C должны иметь общие заголовочные файлы, нужно позаботиться, чтобы эти файлы представляли текст на общем подмножестве этих языков. Нельзя пользоваться специфическими возможностями С++ такими, как классы, перегрузка и т.п. Нельзя использовать одно имя для обозначения типа структуры и другого типа. Функцию без параметров следует описывать как f(void), а не просто f(). Глобальные объекты типа const следует явно специфицировать как static или extern. Для разделения частей программы на ANSI C и С++ можно использовать условную трансляцию с предописанным именем __cplusplus. Функции, которые могут вызываться из программ на обеих языках, должны быть явно описаны, как функции, подлежащие связыванию с С. R.18.3 Анахронизм Реализация С++ может включать перечисленные здесь расширения, чтобы облегчить использование программы на С, или чтобы упростить переход с более ранних версий С++. Отметим, что с каждым расширением связаны нежелательные последствия. Если реализация предоставляет такое расширение, то она должно также предоставлять возможность убедиться в отсутствии этих последствий для исходной программы. Реализация С++ не обязана обеспечивать эти расширения. При описании или определении функции можно использовать слово overload в конструкции спецификация-описания ($$R.7). Если оно используется в спецификации-описания, то считается служебным словом и его нельзя использовать как идентификатор. Определение статического члена класса, представляющего данные, для которого дана стандартная инициализация нулями ($$R.8.4, $$R.9.4), может быть опущено. Можно использовать команды препроцессора старого стиля (до ANSI C). Можно присваивать объекту типа перечисления значение типа int. При удалении массива, тип которого не имеет деструктора, можно указывать число элементов; $$R.5.3.4. Одна функция operator++() может использоваться для перегрузки как префиксных, так и постфиксных операций ++; тоже верно для операции --; $$R.13.4.6. R.18.3.1 Определения функций старого стиля Можно использовать синтаксис С для определений функций: старое-определение-функции: спецификации-описаний opt старый-описатель-функции список-описаний opt тело-функции старый-описатель-функции: описатель ( список-параметров opt ) список-параметров: идентификатор список-параметров , идентификатор Приведем пример: max(a,b) int b; { return (a<b) ? b : a; } Если определенная таким образом функция не была описана ранее, то тип ее формальных параметров полагается (...), т.е. он не будет проверяться. Если она была описана, то тип должен согласовываться с типом, указанным в описании. Приведенный синтаксис нельзя использовать для определения функций-членов. R.18.3.2 Старый стиль задания инициализатора базового класса В конструкции инициализатор-памяти ($$R.12.6.2) можно не указывать имя-класса, обозначающее базовый класс при условии, что существует только один прямой (непосредственный) базовый класс. Поэтому в описании class B { // ... public: B(int); }; class D : public B { // ... D(int i) : (i) { /* ... */ } }; будет вызываться конструктор B с параметром i. R.18.3.3 Присваивание указателю this Присваивая определенные значения указателю this, пользователь мог управлять выделением памяти для объекта некоторого класса. В конструкторе до использования членов класса можно было с помощью такого присваивания реализовать свой алгоритм выделения памяти. Присваивая в деструкторе указателю this нуль, можно было обойти стандартную операцию освобождения объектов класса. Кроме того, присваивание нуля в деструкторе отменяло неявные вызовы деструкторов для членов и базовых классов, например: class Z { int z[10]; Z() { this = my_allocator(sizeof(Z) ); } ~Z() { my_deallocator (this); this = 0; } }; Если выделение памяти уже произошло (как бывает для членов и объектов auto или static), то при входе в конструктор this имеет ненулевое значение и значение нуль в противном случае. Вызовы конструкторов для членов и базовых классов произойдут только после того, как this получил значение. Если в конструкторе базового класса есть присваивание this, то новое значение this будет использоваться и в конструкторах производных классов, если они есть. Отметим, что при наличии указанного анахронизма или тип указателя this не может быть *const, или нужно делать исключение для this из правила о присваивании указателям со спецификацией const. R.18.3.4 Приведение указателей на функцию-член Указатель на функцию-член некоторого объекта можно привести к указателю на какую-то другую функцию, например (int (*) ())p->f. Результирующий указатель будет настроен на функцию, вызов которой будет происходить с помощью обращения к этой функции-члену для того же объекта. Как обычно результат такого вызова считается неопределенным. R.18.3.5 Невложенность классов Если класс описан внутри другого класса и в программе больше не описано классов с этим именем, то его можно использовать, как если бы он был описан вне класса (так обстоит дело с описанием struct в С), например: struct S { struct T { int a; }; int b; }; struct T x; // означает `S::T x;' Список служебных слов auto автоматический break разрыв case вариант catch перехватить char символ class класс const конст continue продолжить default по умолчанию delete удалить do делать double двойной else иначе enum перечисление extern внешний float плавающий for для friend друг goto переход на if если inline подстановка int целый long длинный new новый operator оператор private частный protected защищенный public общий register регистровый return возврат short короткий signed знаковый sizeof размер static статический struct структура switch переключатель template шаблон типа this текущий throw запустить try проверить typedef тип union объединение unsigned беззнаковый virtual виртуальный void пустой volatile изменяемый while пока УКАЗАТЕЛЬ А абстрактный абстрактный класс абстрактный описатель абстрактный тип данных (АТД) абстракция абстракция данных абстракция данных или наследование автоматические агрегат Ада аддитивные операции адрес адрес битового поля адрес и присваивание адрес конструктора Алгол68 американский национальный институт стандартов (ANSI) анахронизм анализатор рекурсивного спуска арифметика беззнакового арифметика фиксированной точности арифметическая особая ситуация арифметические операции с указателем арифметические преобразования арифметический тип ассемблер асинхронные события ассоциативность операций ассоциативный массив ассоциативность операций Б базовый базовый класс безымянное объединение беззнаковая арифметика беззнаковая константа беззнаковый тип библиотека библиотека заголовочных файлов битовое поле блок блокирование (замок) буферизация ввода-вывода В ввод встроенных типов ввод и вывод ввод пользовательских типов ввод-вывод виртуальный базовый класс виртуальный деструктор виртуальный конструктор виртуальная функция включаемый файл включение исходного файла внешнее связывание внутреннее связывание внутренняя структура вложенный класс возврат каретки возвращаемое функцией значение восьмеричная константа восьмеричное число время жизни объекта встроенный встроенная операция встроенный (основной) тип выбор члена класса вывод встроенных типов вывод пользовательских типов выделение пробелами вызов вызов виртуальной функции вызов деструктора вызов операторной функции вызов по значению вызов по ссылке вызов функции выравнивание выравнивание битового поля выравнивание класса выравнивание члена класса выражение выражение-запуска выражение константа выражение-константа выражение-отношения выражение присваивания выражение-приведения выражение-присваивания выражение-сдвига выражение-размещения вычисление стандартного параметра вычитание указателей Г гибридный проект глобальная область видимости глобальная область видимости глобальное безымянное объединение глобальное имя глобальное имя глобальные данные глобальные объекты глубокое копирование горизонтальная табуляция \t группирование особых ситуаций Д данные двойная кавычка десятичная константа деструктор деструктор временного объекта деструктор локального объекта деструктор объединения деструктор производного класса динамическая инициализация динамическая информация о типе динамический контроль типов динамическая ошибка длина имени доступ доступ к базовому классу доступ к виртуальной функции доступ к защищенному члену доступ к имени члена доступ к члену базового класса доступ к члену класса дружественный класс дружественная функция доступ к виртуальной функции Е единица трансляции З завершение программы заголовочный файл загрузчик закрытие потока запрос ресурса запуск особой ситуации запуск программы зарезервированный идентификатор защищенный член знаковый тип И идентификатор иерархия классов иерархия особых ситуаций иерархия объектов изменяемый адрес имя имя класса имя-класса имя перегруженного члена имя перегруженной функции имя-простого-типа имя-шаблонного-класса имя-функции-преобразования инициализатор инициализация инициализация автоматических инициализация базового класса инициализация библиотеки инициализация и присваивание инициализация массива инициализация массива объектов класса инициализация массива символов инициализация объединения инициализация объекта класса инициализация объекта-члена инициализация регистра инициализации ссылки инициализация структуры инициализация члена инициализация члена класса инкапсуляция интерфейс интерфейс класса интерфейсный класс исходный файл исчерпание свободной памяти исчерпание ресурса исчерпание свободной памяти итерация К каркас области приложения класс класс и тип класс или объединение класс или структура класс особой ситуации класс памяти auto Кобол комментарий конец строки \n конкатенация строк конкретный тип конкретный тип данных (КТД) константа константа double константа float константа long константа long double константа unsigned константа перечисления константа пользовательского типа константа с плавающей точкой константа строка конструктор конструктор временного объекта конструктор глобальной переменной конструктор и абстрактный класс конструктор копирования конструктор локального объекта конструктор локальной переменной конструктор объединения конструктор переменной из свободной памяти конструктор производного класса конструктор члена класса конструктор членов массива контролируемое объединение контроль диапазона контроль доступа контроль типов параметров функции копирование косвенность (косвенное обращение) косвенный базовый класс Л лексема лексические соглашения Лисп литерал литеральные константы логическая операция локальная область видимости М макрокоманда макрокоманда препроцессора макрокоманда error макрокоманда null макрокоманда pragma макрообработка макроопределение макроподстановка макроподстановка (подстановка) манипулятор массив метка метка case метка default механизм вызова функции метод проектирования многомерный массив многосимвольная константа многоуровневая обработка ошибок множество символов ASCII множество символов EBCDIC множественное наследование модель каскад модульное программирование модульность мультипликативное-выражение Н направленный ацикличный граф наследование наследование деструктора наследование интерфейса наследование конструктора неоднозначное преобразование типа неоднозначность неоднозначность преобразования класса неожиданные особые ситуации неописанный параметр неперехваченная особая ситуация неопределенный параметр конструктора неявный вызов деструктор неявное преобразование неявное преобразование типа неявное пользовательское преобразование О обобщенный пробел объединение область видимости область видимости friend область видимости вложенного класса область видимости имени область видимости класса область видимости локального класса область видимости макроимени область видимости макроопределения область видимости метки область видимости функции область видимости стандартного параметра обработка ошибок обработчик особой ситуации обратная дробная черта \ обратный вызов обширный интерфейс общий член класса объект объект-функция объектно-ориентированное программирование одиночная кавычка окружение программы операнд const операнд volatile операнд ссылка оператор оператор break оператор continue оператор do оператор for оператор goto оператор if оператор return оператор switch (переключатель) оператор while оператор выражения оператор итерации оператор описания оператор перехода оператор цикла оператор-выражение оператор-описание оператор-перехода операторная функция (operator) операционная система UNIX операция ! операция # операция ## операция %= операция && операция &= операция *= операция ++ операция += операция , операция -- операция -= операция /= операция :: операция <<= операция >>= операция ^= операция больше или равно операция больше чем операция ввода >> операция взятия адреса операция выбора члена класса операция вывода << операция вызова функции операция декремент операция запятая операция индексации операция инкремент операция косвенности операция логического отрицания операция логическое И операция логическое ИЛИ операция меньше или равно операция меньше чем операция неравно операция отношения операция преобразования операция приведения операция равенства операция присваивания операция-присваивания операция разрешения области видимости операция сдвига влево операция сложения операция условия ( ? : ) операция умножения операция унарный минус операция delete операция new операция sizeof описание описание asm описание extern описание friend описание register описание typedef описание битового поля описание в качестве определения описание внешних описание вложенного класса описание доступа описание дружественного класса описание или определение описание имени описание имени класса описание класса описание класса памяти описание локального класса описание массива описание параметра описание постоянного указателя описание ссылки описание статического члена описание стандартного параметра описание статического члена описание типа описание указателя описание функции описание функции-члена описание члена описание члена класса описание шаблона типа описание-шаблона-типа описание шаблонного класса описание шаблонной функции описание эллипсиса в функции описание-особой-ситуации описание-параметра описатель описатель-члена определение определение виртуальной функции определение класса определение конструктора определение области видимости функции определение объекта определение статического члена определение функции определение-функции определение функции-члена определение функции-члена inline определение шаблонного класса определение шаблонной функции определение чисто виртуальной функции определение члена определение шаблонного класса определение шаблонной функции определение элемента перечисления особая ситуация освобождение ресурса основной тип отладка отличия от вычисления выражений в С отличия от области видимости С отличия от описания функции в С отличия от пространства именования С отличия от связывания в С ошибка связывания П память для класса память для массива парадигма программирования параметр параметры командной строки параметр функции парам-шаблона-типа параметр-шаблона-типа первичное выражение перевод формата \f перегрузка перегрузка бинарной операции перегрузка декремента перегрузка и доступ перегрузка и область видимости перегрузка и ссылка перегрузка имени функции перегрузка имени члена перегрузка индексации перегрузка инкремента перегрузка операции перегрузка операции выбора члена перегрузка операции вызова перегрузка операции присваивания перегрузка унарной операции передача параметра функции переопределение виртуальной функции переполнение перехватить (особую ситуацию) перечисление побочные эффекты поверхностное копирование повторный запуск (особой ситуации) поддержка абстракции данных поддержка объектно-ориентированного программирования поле полное-имя-класса пользовательская операция пользовательская операция *= пользовательская операция + пользовательская операция ++ пользовательская операция - пользовательская операция -- пользовательская операция -> пользовательская операция = пользовательская операция индексации пользовательский тип пользовательское преобразование пользовательская унарная операция помеченный оператор поразрядный поразрядное И поразрядное включающее ИЛИ поразрядное исключающее ИЛИ поразрядное копирование поразрядные операции поразрядные логические операции порядок выполнения операций порядок вычислений порядок вычисления выражения порядок вычисления параметров последовательность разрядов постоянное выражение постфиксное выражение постфиксные ++ и -- правила разрешения перегрузки правила областей видимости правила преобразования типа предварительное описание предварительное описание класса предварительное описание шаблона типа предопределенная операция взятия адреса предопределенное присваивание предопределенные макроимена преобразование (типа) преобразование адреса преобразование класса (типа) преобразование нулевого указателя преобразование объекта класса преобразование одного указателя в другой преобразование параметра преобразование плавающей точки в целое преобразование пользовательского типа преобразование при присваивании преобразование пустого указателя преобразование с помощью конструктора преобразование ссылки преобразование типа возвращаемого значения преобразования типа параметра функции преобразование указателя преобразование указателя базового класса преобразование указателя в класс преобразование указателя в функцию преобразование указателя в целое преобразование указателя в член преобразование указателя на массив преобразование указателя на производный класс преобразование указателя типа void* преобразование целого преобразование целого в указатель префиксные ++ и -- приведение приведение адреса приведение базового класса приведение объекта класса приведение производного класса приведение к базовому классу приведение одного указателя в другой приведение ссылки приведение указателя к функции приведение указателя к целому приведение указателя к члену приведение целого к указателю принадлежность принадлежность и наследование приоритет операций присваивание присваивание и адрес присваивание и инициализация присваивание ссылке присваивание указателю проверяемый-блок проверка типа стандартного параметра программа программирование проектирование С++ проектирование библиотеки проектирование и классы проектирование и программирование проектирование и язык проектирование сервисных программ производный класс прототипы процедурное программирование процесс развития прямой базовый класс пустая очередь пустой оператор пустой список параметров пустой параметр пустой указатель (NULL) Р разбиение особых ситуаций разбиение программы развитие С++ раздельная трансляция размер массива по умолчанию размер строки размер структуры размер указателя размещение размножение знака размещение битового поля разрешение неоднозначности разрешение перегрузки разрешение перегрузки шаблонной разряд (бит) разрядный вектор раскручивание стека расположение битовых полей расположение объектов класса реализация редактор связей рекурсивный вызов функции рекурсия С сборка мусора свободная память сводка макрокоманд сводка операторов сводка операций сводка правил области видимости сводка синтаксиса выражения связывание связывание внешних связывание локального имени связывание статических связывание шаблона типа символ символ шаг назад символьная константа символ NULL '\0' символ подчеркивания _ Симула синтаксис макроопределений (сводка) синтаксис операторов синтаксис выражений синтаксис макрокоманд синтаксис операторов синтаксис описаний синтаксис описаний класса синтаксис описателей синтаксис особых ситуаций синтаксис шаблона типа сложное имя класса служебное слово служебное слово class совместимость совместимость с ANSI C (сводка) совместимость с С (сводка) согласованное связывание сопровождение программ составной оператор состояние потока специальный символ спецификации интерфейса спецификация auto спецификация внешнего связывания спецификация доступа спецификация описания спецификация-базовых спецификация-класса спецификация класса памяти спецификация-особой-ситуации спецификация-описателя спецификация-связи спецификация связи функции спецификация-типа спецификация типа double спецификация-типа-char спецификация типа enum спецификация типа float спецификация типа int спецификация типа short спецификация типа struct спецификация типа union спецификация типа unsigned спецификация типа void спецификация типа volatile спецификация функции спецификация шаблона типа спецификация friend спецификация inline спецификация pure спецификация-pure спецификация static спецификация typedef спецификация template спецификация virtual список-базовых список-выражений список-инициализаторов список-обработчиков список операторных функций список-описаний список-описателей список-парам-шаблона-типа список-параметров-шаблона-типа список служебных слов список-членов сравнение указателей средства проектирования ссылка ссылка const ссылка volatile ссылочное выражение стадии проектирования стадии развития стадии трансляции стандартные библиотеки стандартный деструктор стандартные заголовочные файлы стандартная инициализация стандартный каталог include стандартный каталог включаемых файлов стандартный компонент стандартный конструктор стандартный конструктор копирования стандартный контроль доступа стандартная операция присваивания стандартный параметр стандартное преобразование стандартное целочисленное преобразование статическая функция-член статический класс памяти статический контроль типов статический локальный объект статический член статический член класса строка формата строковый класс строковый поток структура структура блока Т тело функции тип тип битового поля тип возвращаемого значения тип виртуальной функции тип конструктора тип массива тип строки тип указателя тип функции тип char тип double тип float тип int тип long тип long double тип short тип signed char тип unsigned char тип void тип volatile точка запуска триграф У узловой класс указание размещения указатель указатель на класс указатель на функцию указатель на функцию-член указатель типа void* указатель const унарное выражение унарная операция унарная-операция унарное выражение унарное-выражение уничтожение уничтожение автоматических уничтожение локальной переменной уничтожение локальных статических управление управление памятью управление свободной памятью управляющий класс управляющая последовательность управляющий символ (\) упрятывание имени уровни абстракции условная трансляция условный уточненное имя уточненное-имя уточненное-имя-класса уточненное-имя-типа Ф файл и поток файловая область видимости форматированный вывод функция функциональная макрокоманда функция-подстановка функция-член функция-член класса функция-член friend функция-член inline (подстановка) функция-член локального класса функция-член volatile функция-член объединения Ц целая константа цели проектирования целочисленное преобразование целочисленный тип цикл развития Ч частный базовый класс частный член класса член член класса член производного класса чисто виртуальная функция Ш шаблон типа шаблонный класс шаблонная функция шаблонная функция-член шаги проектирования шестнадцатеричная константа широкосимвольная строка Э эквивалентность типов эквивалентность шаблонных типов элемент перечисления эллипсис ... Я явное преобразование типа явный вызов деструктора явный вызов конструктора язык язык высокого уровня язык низкого уровня язык BCPL язык C++ язык CLU язык SMALLTALK языки C и C++ A abstract абстрактный class абстрактный класс abstract-declarator абстрактный описатель abstraction абстракция data абстракция данных levels уровни абстракции access доступ base class доступ к базовому классу base class member доступ к члену базового класса class member доступ к члену класса control контроль доступа declaration описание доступа member name доступ к имени члена protected member доступ к защищенному члену specifier спецификация доступа virtual function доступ к виртуальной функции Ada Ада addition operator операция сложения additive operators аддитивные операции address адрес address-of operator операция взятия адреса ADT abstract type абстрактный тип данных (АТД) aggregate агрегат Algol68 Алгол68 alignmemt выравнивание allocation размещение allocation-expression выражение-размещения ambiguity неоднозначность resolution разрешение неоднозначности ambiguous type conversion неоднозначное преобразование типа anachronism анахронизм anonymous union безымянное объединение ANSI ANSI application framework каркас области приложения argument параметр argument-declaration описание-параметра arithmetic арифметический conversion арифметическое преобразование exception арифметическая особая ситуация fixed point арифметика фиксированной точности pointer арифметические операции с указателем type арифметический тип unsigned арифметика беззнакового array массив associative ассоциативный массив initialization инициализация массива multidimensional многомерный массив storage of память для массива type тип массива arrow operator выбор члена класса ASCII character set множество символов ASCII asm declaration описание asm assembler ассемблер assignment присваивание and initialization присваивание и инициализация and lvalue присваивание и адрес assignment-expression выражение-присваивания assignment-operator операция-присваивания associativity of operator ассоциативность операций asynchronous events асинхронные события auto автоматические destruction уничтожение автоматических initialization инициализация автоматических specifier спецификация auto storage class класс памяти auto B backslash обратная дробная черта backspace символ шаг назад base базовый class базовый класс class access доступ к базовому классу class cast приведение к базовому классу base-list список-базовых base-specifier спецификация-базовых BCPL BCPL binding связывание bit разряд (бит) field битовое поле pattern последовательность разрядов vector разрядный вектор bit-field битовое поле address of адрес битового поля alignment выравнивание битового поля declaration описание битового поля layout размещение битового поля type тип битового поля bitwise поразрядный AND operator поразрядное И copy поразрядное копирование exclusive OR operator поразрядное исключающее ИЛИ inclusive OR operator поразрядное включающее ИЛИ logical operators логические операции operators поразрядные операции block блок statement { } составной оператор structure структура блока body, function тело функции break statement оператор break buffering, I/O буферизация ввода-вывода built-in встроенный operator встроенная операция type встроенный (основной) тип C C C C ANSI C ANSI C++ C и C++ C++ C++ evolution развитие C++ call вызов by reference вызов по ссылке by value вызов по значению function вызов функции operator function вызов операторной функции callback обратный вызов carriage return возврат каретки cast приведение base class приведение базового класса class object приведение объекта класса derived class приведение производного класса integer to pointer приведение целого к указателю operator операция приведения pointer to function приведение указателя к функции pointer to integer приведение указателя к целому pointer to member приведение указателя к члену pointer to pointer приведение одного указателя в другой reference приведение ссылки cast-expression выражение-приведения catch перехватить CDT concrete type конкретный тип данных (КТД) char type тип char type, signed тип signed char type specifier спецификация-типа-char type, unsigned тип unsigned char character символ constant символьная константа set, ASCII множество символов ASCII set, EBCDIC множество символов EBCDIC class класс abstract абстрактный класс alignment выравнивание класса and type класс и тип base базовый класс constructor and abstract конструктор и абстрактный класс constructor for derived конструктор для производного класса conversion преобразование объекта класса conversion ambiguity неоднозначность преобразования объекта класса declaration описание класса declaration, forward предварительное описание класса declaration, friend описание дружественного класса definition определение класса derived производный класс destructor for derived деструктор производного класса exception класс особой ситуации friend дружественный класс handle управляющий класс hierarchy иерархия классов interface интерфейс класса member член класса member access доступ к члену класса member access operator операция выбора члена класса member, alignment выравнивание члена класса member, constructor for конструктор члена класса member declaration описание члена класса member function функция-член класса member initialization инициализация члена класса member of derived член производного класса member, private частный член класса member, public общий член класса member, static статический член класса name имя класса name declaration описание имени класса name, elaborated сложное имя класса nested вложенный класс node узловой класс pointer to указатель на класс private base частный базовый класс scope область видимости класса storage память для класса template шаблонный класс versus struct класс или структура versus union класс или объединение virtual base виртуальный базовый класс class-key служебное слово class class-name имя-класса class-specifier спецификация-класса CLU CLU Cobol Кобол comma operator операция запятая command line argument параметры командной строки comment комментарий compatibility совместимость with ANSI C summary совместимость с ANSI C (сводка) with C summary совместимость с С (сводка) compilation, separate раздельная трансляция complete-class-name полное-имя-класса compound statement составной оператор concatenation string конкатенация строк concrete type конкретный тип type, CDT конкретный тип данных (КТД) conditional условный compilation условная трансляция expression operator операция условия ( ? : ) constant константа character символьная константа decimal десятичная константа double константа double enumeration константа перечисления expression выражение константа float константа float floating point константа с плавающей точкой hexadecimal шестнадцатеричная константа integer целая константа long константа long long double константа long double multicharacter многосимвольная константа octal восьмеричная константа of user-defined type константа пользовательского типа unsigned константа unsigned constant-expression выражение-константа constructor конструктор address of адрес конструктора call, explicit явный вызов конструктора conversion by преобразование с помощью конструктора copy конструктор копирования default стандартный конструктор default copy стандартный конструктор копирования definition определение конструктора exception handling конструктор в обработке особых ситуаций for array members конструктор членов массива for class member конструктор члена класса for derived class конструктор производного класса for free store variable конструктор переменной, размещаемой в свободной памяти for global variable конструктор глобальной переменной for local variable конструктор локальной переменной for temporary конструктор временного объекта inheritance наследование конструкторов local object конструктор локального объекта type of тип конструктора undefined argument to неопределенный параметр конструктора union конструктор объединения virtual виртуальный конструктор containment принадлежность and inheritance принадлежность и наследование continue statement оператор continue control access контроль доступа conversion преобразование (типа) argument преобразование параметра arithmetic арифметические преобразования array pointer преобразование указателя на массив base class pointer преобразование указателя базового класса by assignment преобразование при присваивании by constructor преобразование конструктором class преобразование класса (типа) derived class pointer преобразование указателя на производного класса floating point integer преобразование значения с плавающей точкой в целое implicit неявное преобразование implicit type неявное преобразование типа integer преобразование целого integer to pointer преобразование целого в указатель lvalue преобразование адреса null pointer преобразование пустого указателя of pointer to class преобразование указателя в класс operator операция преобразования pointer преобразование указателя pointer to function преобразование указателя в функцию pointer to integer преобразование указателя в целое pointer to member преобразование указателя в член pointer to pointer преобразование одного указателя в другой reference преобразование ссылки return type преобразование типа возвращаемого значения rules, type правила преобразования типа standard стандартное преобразование user-defined пользовательское преобразование user-defined type преобразование пользовательского типа void* pointer преобразование указателя типа void* zero pointer преобразование нулевого указателя conversion-function-name имя-функции-преобразования copy копирование bitwise поразрядное копирование deep глубокое копирование shallow поверхностное копирование D data данные abstraction абстракция данных abstraction, support for поддержка абстракции данных abstraction vs inheritance абстракция данных или наследование global глобальные данные debugging отладка declaration описание access описание доступа argument описание параметра array описание массива as definition описание в качестве определения asm описание asm bit-field описание битового поля class описание класса class member описание члена класса class name описание имени класса constant pointer описание постоянного указателя default argument описание стандартного параметра definition versus описание или определение ellipsis in function описание эллипсиса в функции extern описание extern forward предварительное описание friend описание friend friend class описание дружественного класса function описание функции function member описание функции-члена function template описание шаблонной функции local class описание локального класса member описание члена name описание имени pointer описание указателя reference описание ссылки register описание register specifier спецификация описания statement оператор описания static member описание статического члена storage class описание класса памяти syntax summary синтаксис описаний (сводка) syntax summary, class синтаксис описаний класса (сводка) template описание шаблона типа template class описание шаблонного класса template function описание шаблонной функции type описание типа typedef описание typedef declaration описание declaration-list список-описаний declaration-statement оператор-описание declarator описатель declarator-list список-описателей decl-specifier спецификация-описателя decrement operator операция декремент default access control стандартный контроль доступа argument стандартный параметр argument evaluation вычисление стандартного параметра argument, scope область видимости стандартного параметра argument type checking проверка типа стандартного параметра array size размер массива по умолчанию assignment operator стандартная операция присваивания constructor стандартный конструктор copy constructor стандартный конструктор копирования destructor стандартный деструктор initialization стандартная инициализация definition определение class определение класса constructor определение конструктора enumerator определение элемента перечисления function определение функции function template определение шаблонной функции inline member function определение функции-члена inline member определение члена member function определение функции-члена object определение объекта pure virtual function определение чисто виртуальной функции scope of function определение области видимости функции static member определение статического члена template class определение шаблонного класса template function определение шаблонной функции virtual function определение виртуальной функции delete operator операция delete dereferencing косвенность (косвенное обращение) derived class производный класс design aims цели проектирования and classes проектирование и классы and language проектирование и язык and programming проектирование и программирование library проектирование библиотеки method метод проектирования of C++ проектирование С++ stage стадии проектирования steps шаги проектирования tools средства проектирования destruction уничтожение of auto уничтожение автоматических of local static уничтожение локальных статических of local variable уничтожение локальной переменной destructor деструктор default стандартный деструктор for derived class деструктор производного класса for temporary деструктор временного объекта inheritance наследование деструктора invocation вызов деструктора local object деструктор локального объекта virtual виртуальный деструктор development cycle цикл развития process процесс развития stages стадии развития difference from C expression отличия от вычисления выражений в С evaluation from C function declaration отличия от описания функции в С from C linkage отличия от связывания в С from C name space отличия от пространства именования С from C scope отличия от области видимости С direct base class прямой базовый класс directed acyclic graph направленный ацикличный граф directive error preprocessing макрокоманда error pragma preprocessing макрокоманда pragma preprocessing макрокоманда препроцессора discriminating union контролируемое объединение discrimination of exceptions разбиение особых ситуаций do statement оператор do double constant константа double type тип double type specifier спецификация типа double dynamic type checking динамический контроль типов E EBCDIC character set множество символов EBCDIC elaborated class name сложное имя класса ellipsis ... эллипсис ... empty argument list пустой список параметров queue пустая очередь statement пустой оператор encapsulation инкапсуляция enum type specifier спецификация типа enum enumeration перечисление constant константа перечисления enumerator элемент перечисления equality operator операция равенства equivalence template type эквивалентность шаблонных типов type эквивалентность типов error handling обработка ошибок handling, multilevel многоуровневая обработка ошибок linkage ошибка связывания preprocessing directive макрокоманда error run-time динамическая ошибка escape character управляющий символ (\) sequence управляющая последовательность evaluation default argument вычисление стандартного параметра of expression, order of порядок вычисления выражения order of порядок вычислений order of argument порядок вычисления параметров evolution of С++ развитие С++ exception особая ситуация arithmetic арифметическая особая ситуация class класс особой ситуации handler обработчик особой ситуации hierarchies иерархия особых ситуаций throwing запуск особой ситуации exception-declaration описание-особой-ситуации exception-specification спецификация-особой-ситуации exhaustion free store исчерпание свободной памяти explicit constructor call явный вызов конструктора destructor call явный вызов деструктора type conversion явное преобразование типа expression выражение assignment выражение присваивания constant постоянное выражение order of evaluation of порядок вычисления выражения postfix постфиксное выражение primary первичное выражение reference ссылочное выражение statement оператор выражение syntax summary сводка синтаксиса выражения unary унарное выражение expression-list список-выражений expression-statement оператор-выражение extern declaration описание внешних linkage связывание внешних linkage specification спецификация внешнего связывания external linkage внешнее связывание F fat interface обширный интерфейс field поле bit битовое поле fixed point arithmetic арифметика с фиксированной точностью float constant константа float type тип float type specifier спецификация типа float for statement оператор for format string строка формата form feed \f перевод формата \f forward class declaration предварительное описание класса declaration предварительное описание declaration of template предварительное описание шаблона типа free store свободная память store exhaustion исчерпание свободной памяти store management управление свободной памятью friend friend class дружественный класс declaration описание friend function дружественная функция member function функция-член friend scope of область видимости friend specifier спецификация friend function функция argument параметр функции argument passing передача параметра функции argument type checking контроль типов параметров функции argument type conversion преобразования типа параметра функции body тело функции call вызов функции call mechanism механизм вызова функции call, recursive рекурсивный вызов функции declaration описание функции definition определение функции friend дружественная функция inline функция-подстановка inline member функция-член inline (подстановка) linkage specification спецификация связи функции member функция-член object объект-функция operator операторная функция (operator) pointer to указатель на функцию pointer to member указатель на функцию-член pure virtual чисто виртуальная функция scope область видимости функции specifier спецификация функции template шаблонная функция type тип функции value return возвращаемое функцией значение virtual виртуальная функция function-definition определение-функции fundamental type основной тип G garbage collection сборка мусора global anonymous union глобальное безымянное объединение data глобальные данные name глобальное имя objects глобальные объекты scope глобальная область видимости goto statement оператор goto greater than operator операция больше чем greater than or equal operator операция больше или равно grouping of exceptions группирование особых ситуаций H handle class управляющий класс handler, exception обработчик особой ситуации handler-list список-обработчиков header file заголовочный файл hexadecimal constant шестнадцатеричная константа hierarchy class иерархия классов object иерархия объектов horizontal tab \t горизонтальная табуляция \t hybrid design гибридный проект I identifier идентификатор if statement оператор if implementation реализация implicit conversion неявное преобразование destructor call неявный вызов деструктор type conversion неявное преобразование типа user-defined conversion неявное пользовательское преобразование include directory, standard стандартный каталог include file включаемый файл inclusion source file включение исходного файла increment operator операция инкремент indentation выделение пробелами inderect base class косвенный базовый класс inderection operator операция косвенности inequality operator операция неравно inheritance наследование containment and принадлежность и наследование multiple множественное наследование of constructor наследование конструктора of destructor наследование деструктора initialization инициализация array инициализация массива array of class objects инициализация массива объектов класса assignment and инициализация и присваивание character array инициализация массива символов class member инициализация члена класса class object инициализация объекта класса default стандартная инициализация dynamic динамическая инициализация member инициализация члена member object инициализация объекта-члена of base class инициализация базового класса of structure инициализация структуры initializer инициализатор initializer-list список-инициализаторов inline inline function функция-подстановка member function функция-член inline input and output ввод-вывод of built-in type ввод встроенных типов of user-defined type ввод пользовательских типов operator >> операция ввода >> int int type тип int type specifier спецификация типа int integer constant целая константа conversion целочисленное преобразование integral promotion стандартное целочисленное преобразование type целочисленный тип interface интерфейс class интерфейсный класс inheritance наследование интерфейса fat обширный интерфейс specifications спецификации интерфейса internal linkage внутреннее связывание structure внутренняя структура I/O buffering буферизация ввода-вывода iteration итерация statement оператор итерации J jump statement оператор перехода jump-statement оператор-перехода K keyword служебное слово list список служебных слов L label метка case метка case default метка default scope of область видимости метки labeled statement помеченный оператор language язык design and проектирование и язык high-level язык высокого уровня low-level язык низкого уровня layout bit-field расположение битовых полей class objects расположение объектов класса left shift operator операция сдвига влево less than operator операция меньше чем than or equal to operator операция меньше или равно levels of abstraction уровни абстракции lexical conventions лексические соглашения library библиотека design проектирование библиотеки headers библиотека заголовочных файлов initialization инициализация библиотеки lifetime of object время жизни объекта linkage связывание consistency согласованное связывание error ошибка связывания external внешнее связывание internal внутреннее связывание linker-specification спецификация-связи linker редактор связей Lisp Лисп list of operator functions список операторных функций literal литерал constants литеральные константы loader загрузчик local class declaration описание локального класса class member function функция-член локального класса class, scope of область видимости локального класса scope локальная область видимости locking блокирование (замок) logical AND operator операция логическое И OR operator операция логическое ИЛИ negation operator операция логического отрицания operators, bitwise поразрядные логические операции long long constant константа long double long double double constant константа long double double type тип long double type тип long loop statement оператор цикла lvalue адрес assignment and адрес и присваивание cast приведение адреса conversion преобразование адреса modifiable изменяемый адрес M macro макрокоманда definition, preprocessing макроопределение expansion, preprocessing макроподстановка function-like функциональная макрокоманда name, scope of область видимости макроопределения names, predefined предопределенные макроимена preprocessing макрообработка syntax summary синтаксис макроопределений (сводка) maintenance, software сопровождение программ management управление free store управление свободной памятью memory управление памятью manipulator манипулятор member член member-declaration описание-члена member-declarator описатель-члена member-list список-членов modifiable lvalue изменяемый адрес modular programming модульное программирование modularity модульность multicharacter constant многосимвольная константа multidimensional array многомерный массив multiple inheritance множественное наследование multiplication operator операция умножения multiplicative-expression мультипликативное-выражение N name имя global глобальное имя hiding упрятывание имени length of длина имени linkage of local связывание локального имени overloaded function имя перегруженной функции overloaded member имя перегруженного члена qualified уточненное имя scope of область видимости имени nested class declaration описание вложенного класса class, scope of область видимости вложенного класса new operator операция new newline \n конец строки \n node class узловой класс null character символ null '\0' pointer пустой указатель (null) O object объект object-oriented programming объектно-ориентированное программирование octal constant восьмеричная константа number восьмеричное число operand const операнд const reference операнд ссылка volatile операнд volatile operator , операция , ! операция ! # операция # ## операция ## %= операция %= && операция && &= операция &= *= операция *= *=, user-defined пользовательская операция *= +, user-defined пользовательская операция + ++ операция ++ ++, user-defined пользовательская операция ++ += операция += -, user-defined пользовательская операция - -- операция -- --, user-defined пользовательская операция -- -= операция -= ->, user-defined пользовательская операция -> /= операция /= :: операция :: <<, output операция вывода << <<= операция <<= =, user-defined пользовательская операция = >>, input операция ввода >> >>= операция >>= ^= операция ^= address-of операция взятия адреса assignment операция присваивания associativity ассоциативность операций binding strength порядок выполнения операций built-in встроенные операции function call операция вызова функции precedence приоритет операций sizeof операция sizeof subscripting операция индексации summary сводка операций user-defined пользовательская операция operator function операторная функция function, list of список операторных функций order of argument evaluation порядок вычисления параметров of evaluation порядок вычислений output formatted форматированный вывод input and ввод и вывод of built-in type вывод встроенных типов of user-defined type вывод пользовательских типов operator << операция вывода << overflow переполнение overloaded assignment operator перегрузка операции присваивания binary operator перегрузка бинарной операции decrement operator перегрузка декремента function call operator перегрузка операции вызова function name перегрузка имени функции increment operator перегрузка инкремента member access operator перегрузка операции выбора члена member name перегрузка имени члена operator перегрузка операции subscripting operator перегрузка индексации unary operator перегрузка унарной операции overloading перегрузка and access перегрузка и доступ and scope перегрузка и область видимости resolution разрешение перегрузки resolution rules правила разрешения перегрузки overriding virtual function переопределение виртуальной функции P paradigm, programming парадигма программирования placement указание размещения pointer указатель arithmetic арифметические операции указателей assignment to присваивание указателю comparison сравнение указателей const указатель const conversion преобразование указателей declaration описание указателя null пустой указатель null size of размер указателя substraction вычитание указателей type тип указателя postfix ++ and -- постфиксные ++ и -- expression постфиксное выражение precedence of operator приоритет операций predefined address-of operator предопределенная операция взятия адреса assignment operator предопределенное присваивание macronames предопределенные макроимена prefix ++ and -- префиксные ++ и -- preprocessing макрообработка directive макрокоманда directive, error макрокоманда error directive, null макрокоманда null directive, pragma макрокоманда pragma macro definition макроопределение macro expansion макроподстановка (подстановка) syntax summary сводка макрокоманд primary expression первичное выражение private private base class частный базовый класс class member частный член класса procedural programming процедурное программирование program программа environment окружение программы partitioning разбиение программы start запуск программы termination завершение программы protected protected member защищенный член member access доступ к защищенному члену prototypes прототипы public public class member общий член класса pure specifier спецификация pure virtual function чисто виртуальная функция pure-specifier спецификация-pure Q qualified name уточненное имя qualified-class-name уточненное-имя-класса qualified-name уточненное-имя qualified-type-name уточненное-имя-типа queue empty пустая очередь quote, single одиночная кавычка double двойная кавычка R range checking контроль диапазона recursion рекурсия recursive decent parser анализатор рекурсивного спуска function call рекурсивный вызов функции reference ссылка assignment присваивание ссылки assignment to присваивание ссылке call by вызов по ссылке cast приведение ссылки conversion преобразование ссылки const ссылка const declaration описание ссылки initialization инициализации ссылки operand операнд ссылка overloading and перегрузка и ссылка volatile ссылка volatile register declaration описание register initialization инициализация регистра relational operator операция отношения relational-expression выражение-отношения reserved identifier зарезервированный идентификатор resolution ambiguity разрешение неоднозначности scoping ambiguity разрешение неоднозначности области видимости template function overloading разрешение перегрузки шаблонной функции resource acquisition запрос ресурса exhaustion исчерпание ресурса release освобождение ресурса re-throw повторный запуск (особой ситуации) return return return statement оператор return return type тип возвращаемого значения run-time error динамическая ошибка initialization динамическая инициализация type information динамическая информация о типе S scope область видимости class область видимости класса file файловая область видимости function область видимости функции global глобальная область видимости local локальная область видимости of label область видимости метки of local class область видимости локального класса of macro name область видимости макроимени of name область видимости имени of nested class область видимости вложенного класса resolution operator операция разрешения области видимости rules summary сводка правил области видимости separate compilation раздельная трансляция shift-expression выражение-сдвига short type тип short type specifier спецификация типа short side effects побочные эффекты sign extension размножение знака signed char type тип signed char type знаковый тип simple-type-name имя-простого-типа Simula Симула size of pointer размер указателя of string размер строки of structure размер структуры sizeof operator операция sizeof Smalltalk Smalltalk source file исходный файл file, inclusion включение исходного файла special character специальный символ specifier auto спецификация auto declaration спецификация описания friend спецификация friend function спецификация функции inline спецификация inline static спецификация static storage class спецификация класса памяти template спецификация шаблона типа typedef спецификация typedef virtual спецификация virtual stack unwinding раскручивание стека standard component стандартный компонент conversion стандартное преобразование headers стандартные заголовочные файлы include directory стандартный каталог включаемых файлов libraries стандартные библиотеки statement оператор break оператор break compound составной оператор continue оператор continue declaration оператор описания do оператор do empty пустой оператор expression оператор выражения for оператор for goto оператор goto if оператор if summary сводка операторов switch оператор switch (переключатель) syntax summary синтаксис операторов while оператор while static type checking статический контроль типов static static class member статический член класса linkage of связывание статических local object статический локальный объект member статический член member declaration описание статического члена member definition определение статического члена member function статическая функция-член specifier спецификация static storage class статический класс памяти stream closing of закрытие потока file and файл и поток state состояние потока string строковый поток string class строковый класс concatenation конкатенация строк constant константа строка type of тип строки wide-character широкосимвольная строка struct struct type specifier спецификация типа struct structure структура initialization of инициализация структуры subclass вложенный класс subscripting user-defined пользовательская операция индексации summary class declaration syntax синтаксис описаний класса compatibility with ANSI C совместимость с ANSI C compatibility with C совместимость с С declaration syntax синтаксис описаний declarator syntax синтаксис описателей exception handling syntax синтаксис особых ситуаций expression syntax синтаксис выражений macro syntax синтаксис макрокоманд scope rules правила областей видимости statement syntax синтаксис операторов template syntax синтаксис шаблонов типа support for data abstraction поддержка абстракции данных for object-oriented programming поддержка объектно-ориентированного программирования T template шаблон типа class шаблонный класс class declaration описание шаблонного класса class definition определение шаблонного класса declaration описание шаблона типа function шаблонная функция function declaration описание шаблонной функции function definition определение шаблонной функции linkage of связывание шаблона типа member function шаблонная функция-член specifier спецификация template syntax summary синтаксис шаблона типа template-arg парам-шаблона-типа template-arg-list список-парам-шаблона-типа template-argument параметр-шаблона-типа template-argument-list список-параметров-шаблона-типа template-class-name имя-шаблонного-класса template-declaration описание-шаблона-типа temporary временный объект this this throw throw throw-expression выражение-запуска throwing, exception запуск особой ситуации throw-point точка запуска token лексема tools design проектирование сервисных программ translation phases стадии трансляции unit единица трансляции trigraph триграф try try try-block проверяемый-блок type тип user-defined пользовательский тип type-specifier спецификация-типа U unary expression унарное выражение minus operator операция унарный минус operator унарная операция operator, user-defined пользовательская унарная операция plus, operator операция унарный плюс unary-expression унарное-выражение unary-operator унарная-операция uncaught exception неперехваченная особая ситуация undeclared argument неописанный параметр underscore character символ подчеркивания _ unexpected exceptions неожиданные особые ситуации union объединение anonymous безымянное объединение constructor конструктор объединения destructor деструктор объединения discriminating контролируемое объединение initialization инициализация объединения member function функция-член объединения type specifier спецификация типа union UNIX UNIX unsigned arithmetic беззнаковая арифметика char type тип unsigned char constant беззнаковая константа type беззнаковый тип type specifier спецификация типа unsigned V vertical tab \v вертикальная табуляция \v virtual virtual base class виртуальный базовый класс destructor виртуальный деструктор function виртуальная функция function access доступ к виртуальной функции function call вызов виртуальной функции function, type of тип виртуальной функции specifier спецификация virtual user-defined conversion виртуальное пользовательское преобразование void void argument пустой параметр pointer to указатель типа void* type тип void type specifier спецификация типа void volatile volatile member function функция-член volatile operand операнд volatile reference ссылка volatile type тип volatile type specifier спецификация типа volatile W waterfall model модель каскад white space обобщенный пробел wide-character string широкосимвольная строка  * ПРИМЕРЫ *  b1_1_1.cxx #include <stream.hxx> main() { cout << "Hello, world\n"; } b1_1_3.cxx #include <stream.hxx> main () { int inch = 0; cout << "inches="; cin >> inch; cout << inch; cout << "in = "; cout << inch*2.54; cout << " cm\n"; } b1_4_5v.cxx #include <stream.hxx> main() { const float fac = 2.54; float x, in, cm; char ch = 0; for ( int i= 0; i< 8; i++) { cerr << "enter length: "; cin >> x >> ch; if (ch == 'i' ) { // inch in = x; cm = x*fac; } else if (ch == 'c') { // cm in = x/fac; cm = x; } else in = cm = 0; cerr << in << "in = " << cm << " cm\n"; } } b1_5.cxx #include <stream.hxx> extern float pow(float, int); main() { for (int i=0; i<10; i++) cout << pow(2,i) << "\n"; } extern void error(char *); float pow(float x, int n) { if (n < 0) { error ("sorry, negative exponent to pow()"); return 0; } switch (n) { case 0: return 1; case 1: return x; default: return x*pow(x,n-1); } } void error(char *s) { cout << s; } b1__13.cxx #include <stream.hxx> // 1.11 class vector { int *v; int sz; public: vector(int); // constructor ~vector(); // destructor int size() { return sz; } void set_size(int); int& operator[](int); int& elem(int i) { return v[i]; } }; // 1.13 class vec : public vector { int low, high; public: vec(int, int); int& elem(int); int& operator[](int); }; main() { vector a(10); for (int i=0; i<a.size(); i++) { a[i] = i; cout << a[i] << " "; } cout << "\n"; vec b(10,19); for (i=0; i<b.size(); i++) b[i+10] = a[i]; for (i=0; i<b.size(); i++) cout << b[i+10] << " "; cout << "\n"; } extern void exit(int); // 1.13 void error(char* p) { cerr << p << "\n"; exit (1); } // 1.11 vector::vector(int s) { if (s<=0) error("bad vector size"); sz = s; v = new int[s]; } int& vector::operator[](int i) { if (i<0 || sz<=i) error("vector index out of range"); return v[i]; } vector::~vector() { delete v; } // 1.13 int& vec::elem(int i) { return vector::elem(i-low); } vec::vec(int lb, int hb) : (hb-lb+1) { if (hb-lb<0) hb = lb; low = lb; high = hb; } void vector::set_size(int) { /* dummy */ } int& vec::operator[](int i) { if (i<low || high<i) error("vec index out of range"); return elem(i); } b1__14.cxx #include<stream.hxx> extern void exit( int ); extern void error( char* ); // 1.11 class vector { int *v; int sz; public: vector(int); // constructor ~vector(); // destructor int size() { return sz; } void set_size(int); int& operator[](int); int& elem(int i) { return v[i]; } }; vector::vector(int s) { if (s<=0) error("bad vector size"); sz = s; v = new int[s]; } int& vector::operator[](int i) { if (i<0 || sz<=i) error("vector index out of range"); return v[i]; } vector::~vector() { delete v; } // 1.14 class Vec : public vector { public: Vec(int s) : (s) {} Vec(Vec&); ~Vec() {} void operator=(Vec&); void operator*=(Vec&); void operator*=(int); }; Vec::Vec(Vec& a) : (a.size()) { int sz = a.size(); for (int i = 0; i<sz; i++) elem(i) =a.elem(i); } void Vec::operator=(Vec& a) { int s = size(); if (s!=a.size()) error("bad vector size for ="); for (int i =0; i<s; i++) elem(i)=a.elem(i); } Vec operator+(Vec& a, Vec& b) { int s = a.size(); if (s != b.size()) error("bad vector size for +"); Vec sum(s); for (int i=0; i<s; i++) sum.elem(i) = a.elem(i) + b.elem(i); return sum; } void error(char* p) { cerr << p << "\n"; exit (1); } void vector::set_size(int) { } main() { Vec a(10); Vec b(10); for (int i=0; i<a.size(); i++) a[i] = i; b = a; Vec c = a+b; for (i=0; i<c.size(); i++) cout << c[i] << "\n"; } b1__16.cxx #include <vector.hxx> declare(vector,int); implement(vector,int); main() { vector(int) vv(10); vv[2] = 3; vv[10] = 4; // range error } b2_1_3.cxx #include <stream.hxx> int a = 1; void f() { int b = 1; static int c = 1; cout << " a = " << a++ << " b = " << b++ << " c = " << c++ << "\n"; } main () { while (a < 4) f(); } b2_3.cxx #include <stream.hxx> main() { int* p = new int; cout << "sizeof(int) = " << sizeof(int) "\n"; } b2_3_6a.cxx #include <stream.hxx> extern int strlen(char*); char alpha[] = "abcdefghijklmnopqrstuvwxyz"; main () { int sz = strlen(alpha); for (int i=0; i<sz; i++) { char ch = alpha[i]; cout << "'" << chr(ch) << "'" << " = " << ch << " = 0" << oct(ch) << " = 0x" << hex(ch) << "\n"; } } b2_3_6b.cxx #include <stream.hxx> char v[2][5] = { 'a', 'b', 'c', 'd', 'e', '0', '1', '2', '3', '4' }; main() { for ( int i = 0; i<2; i++) { for (int j = 0; j <5; j++) cout << "v[" << i << "][" << j << "]=" << chr(v[i][j]) << " "; cout << "\n"; } } b2_3_7.cxx #include <stream.hxx> main() { char cv[10]; int iv[10]; char* pc = cv; int* pi = iv; cout << "char* " << long(pc+1)-long(pc) << "\n"; cout << "int* " << long(pi+1)-long(pi) << "\n"; } b2_3__10.cxx #include <stream.hxx> struct pair { char* name; int val; }; extern int strlen(char*); extern int strcpy(char*, char*); extern int strcmp(char*, char*); const large = 1024; static pair vec[large]; pair* find(char* p) { for (int i=0; vec[i].name; i++) if (strcmp(p,vec[i].name)==0) return &vec[i]; if (i== large) return &vec[large-1]; return &vec[i]; } int& value(char* p) { pair* res = find(p); if (res->name == 0) { res->name = new char[strlen(p)+1]; strcpy(res->name,p); res->val = 0; } return res->val; } const MAX = 256; main () { char buf [MAX]; while ( cin>>buf) value(buf)++; for (int i=0; vec[i].name; i++) cout << vec[i].name << ":" << vec[i].val << "\n"; } b3_1all.cxx #include <xstream.hxx> #include <ctype.h> enum token_value { NAME, NUMBER, END, PLUS = '+', MINUS = '-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' }; token_value curr_tok; struct name { char* string; name* next; double value; }; const TBLSZ = 23; name* table[TBLSZ]; int no_of_errors; double error(char* s) { cerr << "error: " << s << "\n"; no_of_errors++; return 1; } extern int strlen(const char*); extern int strcmp(const char*, const char*); extern char* strcpy(char*, const char*); name* look(char* p, int ins = 0) { int ii= 0; char *pp = p; while (*pp) ii = ii<<1 ^ *pp++; if (ii < 0) ii = -ii; ii %= TBLSZ; for (name* n=table [ii]; n; n=n->next) if (strcmp(p,n->string) == 0) return n; if (ins == 0) error("name not found"); name* nn = new name; nn->string = new char[strlen(p) + 1]; strcpy(nn->string,p); nn->value = 1; nn->next = table[ii]; table[ii] = nn; return nn; } inline name* insert(char* s) { return look (s,1); } token_value get_token(); double term(); double expr() { double left = term(); for (;;) switch (curr_tok) { case PLUS: get_token(); left += term(); break; case MINUS: get_token(); left -= term(); break; default : return left; } } double prim(); double term() { double left = prim(); for (;;) switch (curr_tok) { case MUL: get_token(); left *= prim(); break; case DIV: get_token(); double d = prim(); if (d == 0) return error("divide by o"); left /= d; break; default: return left; } } int number_value; char name_string[80]; double prim() { switch (curr_tok) { case NUMBER: get_token(); return number_value; case NAME: if (get_token() == ASSIGN) { name* n = insert(name_string); get_token(); n->value = expr(); return n->value; } return look(name_string)->value; case MINUS: get_token(); return -prim(); case LP: get_token(); double e = expr(); if (curr_tok != RP) return error(") expected"); get_token(); return e; case END: return 1; default: return error ("primary expected"); } } token_value get_token() { char ch = 0; do { if(!cin.get(ch)) return curr_tok = END; } while (ch!='\n' && isspace(ch)); switch (ch) { case ';': case '\n': cin >> WS; return curr_tok=PRINT; case '*': case '/': case '+': case '-': case '(': case ')': case '=': return curr_tok=ch; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': cin.putback(ch); cin >> number_value; return curr_tok=NUMBER; default: if (isalpha(ch)) { char* p = name_string; *p++ = ch; while (cin.get(ch) && isalnum(ch)) *p++ = ch; cin.putback(ch); *p = 0; return curr_tok=NAME; } error ("bad token"); return curr_tok=PRINT; } } int main(int argc, char* argv[]) { switch (argc) { case 1: break; case 2: cin = *new istream(strlen(argv[1]),argv[1]); break; default: error("too many arguments"); return 1; } // insert predefined names: insert("pi")->value = 3.1415926535897932385; insert("e")->value = 2.7182818284590452354; while (1) { get_token(); if( curr_tok == END) break; if (curr_tok == PRINT) continue; cout << expr() << "\n"; } return no_of_errors; } b3_2_6a.cxx extern void strcpy(char *,char *); extern void exit(int); extern int strlen(char *); char *save_string(char* p) { char* s = new char[strlen(p)+1]; strcpy(s,p); return s; } int main (int argc, char* argv[]) { if (argc < 2) exit(1); int size = strlen(argv[1])+1; char* p = save_string (argv[1]); delete[size] p; } b3_2_6b.cxx #include <stream.hxx> extern void exit( int ); void out_of_store() { cout << "operator new failed: out of store\n"; exit(1); } typedef void (*PF)(); extern PF set_new_handler(PF); main() { set_new_handler(&out_of_store); char *p = new char[100000000]; cout << "done, p = " << long(p) << "\n"; } b4_6_8.cxx // This version of the program does not assume sizeof(int)==sizeof(char*) ! #include <stream.hxx> #include <stdarg.hxx> extern void exit(int); void error (int ...); main(int argc, char* argv[]) { switch (argc) { case 1: error(0,argv[0],(char*)0); break; case 2: error(0,argv[0],argv[1],(char*)0); break; default : error(1,"with",dec(argc-1),"arguments",(char*)0); } } void error(int n ...) { va_list ap; va_start(ap,n); for (;;) { char *p = va_arg(ap,char*); if (p == 0) break; cerr << p << " "; } va_end(ap); cerr << "\n"; if (n) exit(n); } b4_6_9.cxx #include <stream.hxx> struct user { char *name; char* id; int dept; }; typedef user* Puser; user heads[] = { "Mcilroy M.D", "doug", 11271, "Aho A.v.", "ava", 11272, "Weinberger P.J.", "pjw", 11273, "Schryer N.L.", "nls", 11274, "Schryer N.L.", "nls", 11275, "Kernighan B.W.", "bwk", 11276 }; typedef int (*CFT)(char*,char*); void sort(char* base, unsigned n, int sz, CFT cmp) { for (int i=0; i<n-1; i++) for (int j=n-1; i<j; j--) { char* pj = base+j*sz; char *pj1 = pj-sz; if ((*cmp)(pj,pj1) <