Бьерн Страуструп (Стpаустpуп - Книга о C++), страница 2
Описание файла
Документ из архива "Стpаустpуп - Книга о C++", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика" в общих файлах.
Онлайн просмотр документа "Бьерн Страуструп"
Текст 2 страницы из документа "Бьерн Страуструп"
места в руководстве.
Книга в основном посвящена вопросу, как с помощью языка C++
структурировать программу, а не вопросу, как записать на нем алгоритм.
Следовательно, там, где можно было выбирать, предпочтение отдавалось не
профессиональным, но сложным для понимания, а тривиальным алгоритмам. Так
в одном из примеров используется пузырьковая сортировка, хотя алгоритм
быстрой сортировки больше подходит для настоящей программы. Часто
написать ту же программу, но с более эффективным алгоритмом, предлагается
в виде упражнения.
Глава 1 содержит краткий обзор основных концепций и конструкций С++.
Она позволяет познакомиться с языком в общих чертах. Подробные объяснения
конструкций языка и способов их применения содержатся в последующих
главах. Обсуждаются в первую очередь средства, обеспечивающие абстракцию
данных и объектно-ориентированное программирование. Основные средства
процедурного программирования упоминаются кратко.
В главах 2, 3 и 4 описываются средства С++, которые не используются
для определения новых типов: основные типы, выражения и структуры
управления. Другими словами, эти главы содержат описание той части языка,
которая по сути представляет С. Изложение в указанных главах идет в
углубленном виде.
Главы 5 - 8 посвящены средствам построения новых типов, которые не
имеют аналогов в С. В главе 5 вводится основное понятие - класс. В ней
показано, как можно определять пользовательские типы (классы),
инициализировать их, обращаться к ним, и, наконец, как уничтожать их.
Глава 6 посвящена понятию производных классов, которое позволяет строить
из простых классов более сложные. Оно дает также возможность эффективной и
безопасной (в смысле типа) работы в тех ситуациях, когда типы объектов на
стадии трансляции неизвестны. В главе 7 объясняется, как можно определить
унарные и бинарные операции для пользовательских типов, как задавать
преобразования таких типов, и каким образом можно создавать, копировать и
удалять объекты, представляющие пользовательские типы. Глава 8 посвящена
шаблонам типа, т.е. такому средству С++, которое позволяет определить
семейство типов и функций.
В главе 9 обсуждается обработка особых ситуаций, рассматриваются
возможные реакции на ошибки и методы построения устойчивых к ошибкам
систем. В главе 10 определяются классы ostream и istream, предоставляемые
стандартной библиотекой для потокового ввода-вывода.
Главы 11 - 13 посвящены вопросам, связанным с применением С++ для
проектирования и реализации больших программных систем. В главе 11 в
основном рассматриваются вопросы проектирования и управления программными
проектами. В главе 12 обсуждается взаимосвязь между языком С++ и
проблемами проектирования. В главе 13 показаны способы создания библиотек.
Завершается книга справочным руководством по С++.
Ссылки на различные части книги даются в виде $$2.3.4, что означает
раздел 3.4 главы 2. Для обозначения справочного руководства применяется
буква R, например, $$R.8.5.5.
Замечания по реализации
Существует несколько распространяемых независимых реализаций С++.
Появилось большое число сервисных программ, библиотек и интегрированных
систем программирования. Имеется масса книг, руководств, журналов, статей,
сообщений по электронной почте, технических бюллетеней, отчетов о
конференциях и курсов, из которых можно получить все необходимые сведения
о последних изменениях в С++, его использовании, сервисных программах,
библиотеках, новых трансляторах и т.д. Если вы серьезно рассчитываете на
С++, стоит получить доступ хотя бы к двум источникам информации, поскольку
у каждого источника может быть своя позиция.
Большинство программных фрагментов, приведенных в книге, взяты
непосредственно из текстов программ, которые были транслированы на машине
DEC VAX 11/8550 под управлением 10-й версии системы UNIX [25].
Использовался транслятор, являющийся прямым потомком транслятора С++,
созданного автором. Здесь описывается "чистый С++", т.е. не используются
никакие зависящие от реализации расширения. Следовательно, примеры должны
идти при любой реализации языка. Однако, шаблоны типа и обработка особых
ситуаций относятся к самым последним расширениям языка, и возможно, что
ваш транслятор их не содержит.
Упражнения
Упражнения даются в конце каждой главы. Чаще всего они предлагают
написать программу. Решением может считаться программа, которая
транслируется и правильно работает хотя бы на нескольких тестах.
Упражнения могут значительно различаться по сложности, поэтому дается
приблизительная оценка степени их сложности. Рост сложности
экспоненциальный, так что, если на упражнение (*1) у вас уйдет пять минут,
то (*2) может занять час, а (*3) - целый день. Однако время написания и
отладки программы больше зависит от опыта читателя, чем от самого
упражнения. На упражнение (*1) может потребоваться целый день, если перед
запуском программы читателю придется ознакомиться с новой вычислительной
системой. С другой стороны, тот, у кого под рукой окажется нужный набор
программ, может сделать упражнение (*5) за один час.
Любую книгу по программированию на языке С можно использовать как
источник дополнительных упражнений при изучении глав 2 - 4. В книге Ахо
([1]) приведено много общих структур данных и алгоритмов в терминах
абстрактных типов данных. Эту книгу также можно использовать как источник
упражнений при изучении глав 5 - 8. Однако, использованному в ней языку не
достает функций-членов и производных классов. Поэтому определяемые
пользователем типы на С++ можно написать более элегантно.
Замечания по проекту языка
При разработке языка С++ одним из важнейших критериев выбора была
простота. Когда возникал вопрос, что упростить: руководство по языку и
другую документацию или транслятор, - то выбор делали в пользу первого.
Огромное значение придавалось совместимости с языком С, что помешало
удалить его синтаксис.
В С++ нет типов данных и элементарных операций высокого уровня.
Например, не существует типа матрица с операцией обращения или типа строка
с операцией конкатенации. Если пользователю понадобятся подобные типы, он
может определить их в самом языке. Программирование на С++ по сути
сводится к определению универсальных или зависящих от области приложения
типов. Хорошо продуманный пользовательский тип отличается от встроенного
типа только способом определения, но не способом применения.
Из языка исключались возможности, которые могут привести к накладным
расходам памяти или времени выполнения, даже если они непосредственно не
используются в программе. Например, было отвергнуто предложение хранить в
каждом объекте некоторую служебную информацию. Если пользователь описал
структуру, содержащую две величины, занимающие по 16 разрядов, то
гарантируется, что она поместится в 32-х разрядный регистр.
Язык С++ проектировался для использования в довольно традиционной
среде, а именно: в системе программирования С операционной системы UNIX.
Но есть вполне обоснованные доводы в пользу использования С++ в более
богатой программной среде. Такие возможности, как динамическая загрузка,
развитые системы трансляции и базы данных для хранения определений типов,
можно успешно использовать без ущерба для языка.
Типы С++ и механизмы упрятывания данных рассчитаны на определенный
синтаксический анализ, проводимый транслятором для обнаружения случайной
порчи данных. Они не обеспечивают секретности данных и защиты от
умышленного нарушения правил доступа к ним. Однако, эти средства можно
свободно использовать, не боясь накладных расходов памяти и времени
выполнения программы. Учтено, что конструкция языка активно используется
тогда, когда она не только изящно записывается на нем, но и вполне по
средствам обычным программам.
Историческая справка
Безусловно С++ многим обязан языку С [8], который сохраняется как его
подмножество. Сохранены и все свойственные С средства низкого уровня,
предназначенные для решения самых насущных задач системного
программирования. С, в свою очередь, многим обязан своему предшественнику
языку BCPL [13]. Комментарий языка BCPL был восстановлен в С++. Если
читатель знаком с языком BCPL, то может заметить, что в С++ по-прежнему
нет блока VALOF. Еще одним источником вдохновения был язык SIMULA-67
[2,3]; именно из него была заимствована концепция классов (вместе c
производными классами и виртуальными функциями). Оператор inspect из
SIMULA-67 намеренно не был включен в С++. Причина - желание
способствовать модульности за счет использования виртуальных функций.
Возможность в С++ перегрузки операций и свобода размещения описаний всюду,
где может встречаться оператор, напоминают язык Алгол-68 [24].
С момента выхода в свет первого издания этой книги язык С++ подвергся
существенным изменениям и уточнениям. В основном это касается разрешения
неоднозначности при перегрузке, связывании и управлении памятью. Вместе с
тем, были внесены незначительные изменения с целью увеличить совместимость
с языком С. Были также введены некоторые обобщения и существенные
расширения, как то: множественное наследование, функции-члены со
спецификациями static и const, защищенные члены (protected), шаблоны типа
и обработка особых ситуаций. Все эти расширения и доработки были нацелены
на то, чтобы С++ стал языком, на котором можно создавать и использовать
библиотеки. Все изменения описываются в [10,18,20,21 и 23].
Шаблоны типов появились частично из-за желания формализовать
макросредства, а частично были инспирированы описанием генерических
объектов в языке Ада (с учетом их достоинств и недостатков) и
параметризированными модулями языка CLU. Механизм обработки особых
ситуаций появился отчасти под влиянием языков Ада и CLU [11], а отчасти
под влиянием ML [26]. Другие расширения, введенные за период между 1985 и
1991 г.г. (такие как множественное наследование, статические функции-члены
и чистые виртуальные функции), скорее появились в результате обобщения
опыта программирования на С++, чем были почерпнуты из других языков.
Более ранние версии языка, получившие название "С с классами" [16],
использовались, начиная с 1980 г. Этот язык возник потому, что автору
потребовалось написать программы моделирования, управляемые прерываниями.
Язык SIMULA-67 идеально подходит для этого, если не учитывать
эффективность. Язык "С с классами" использовался для больших задач
моделирования. Строгой проверке подверглись тогда возможности написания на
нем программ, для которых критичны ресурсы времени и памяти. В этом языке
недоставало перегрузки операций, ссылок, виртуальных функций и многих
других возможностей. Впервые С++ вышел за пределы исследовательской
группы, в которой работал автор, в июле 1983 г., однако тогда многие
возможности С++ еще не были разработаны.
Название С++ (си плюс плюс) , было придумано Риком Маскитти летом 1983
г. Это название отражает эволюционный характер изменений языка С.
Обозначение ++ относится к операции наращивания С. Чуть более короткое имя
С+ является синтаксической ошибкой. Кроме того, оно уже было использовано
как название совсем другого языка. Знатоки семантики С находят, что С++
хуже, чем ++С. Язык не получил названия D, поскольку он является
расширением С, и в нем не делается попыток решить какие-либо проблемы за
счет отказа от возможностей С. Еще одну интересную интерпретацию названия
С++ можно найти в приложении к [12].
Изначально С++ был задуман для того, чтобы автору и его друзьям не
надо было программировать на ассемблере, С или других современных языках
высокого уровня. Основное его предназначение - упростить и сделать более
приятным процесс программирования для отдельного программиста. До
недавнего времени не было плана разработки С++ на бумаге. Проектирование,
реализация и документирование шли параллельно. Никогда не существовало
"проекта С++" или "Комитета по разработке С++". Поэтому язык развивался и
продолжает развиваться так, чтобы преодолеть все проблемы, с которыми
столкнулись пользователи. Толчками к развитию служат также и обсуждения
автором всех проблем с его друзьями и коллегами.
В связи с лавинообразным процессом увеличения числа пользователей С++,
пришлось сделать следующие изменения. Примерно в 1987 г. стало очевидно,
что работа по стандартизации С++ неизбежна и что следует незамедлительно