ПРЕДИСЛОВИЕ
Удивительно, но книга получилась короткой. Думаю, это просто замечательно. Моя книга C++ Premier заняла 1237 страниц, включая алфавитный указатель, титульные листы и страницу с посвящениями. В этой книге всего 276 страниц - говоря в терминах бокса, мы перешли в легкий вес.
Конечно, первый вопрос: почему? На самом деле это целая история.
Я несколько лет донимал всех и каждого в компании Disney Feature Animation просьбами разрешить мне присоединиться к работе над производством фильмов. Я просил директоров, управляющих, если говорить всю правду - то даже Микки. Думаю, это было прикосновением к сказке. Голливуд. Большой экран. К тому же, кроме степени магистра компьютерных наук, у меня есть и степень магистра искусств, а работа над фильмом обещала дать простор для личного творчества. Руководителям, конечно, я говорил, что опыт работы в производстве мне нужен для того, чтобы создавать действительно полезные инструменты. Как автор компиляторов, я всегда оставался одним из главных своих пользователей. Трудно защищаться или переносить несправедливую критику, когда сам являешься одним из главных жалобщиков.
Заинтересованным в том, чтобы я присоединился к процессу производства, оказался человек, который отвечал за компьютерные спецэффекты в восьмой части Firebird мультфильма Fantasia 2000. Для пробы он попросил меня написать утилиту для считывания информации о сцене с камеры и создать модуль, который позволил бы передать данные с камеры в анимационный пакет Houdini. Конечно же, я написал программы на языке C++. Все заработало нормально. Им понравилось. Меня пригласили на борт.
Как-то меня попросили переписать эту утилиту на языке Perl (спасибо Джинко (Jinko) и Чуану (Chyuan)). Объяснили, что другие ТД не сильны в программировании, но знают языки Perl, Tcl и т.п. (Аббревиатура ТД из жаргона киноиндустрии является сокращением от слов технический директор. Я был ТД программного обеспечения нашего отдела. Еще были ТД по освещению (привет, Мира) и по моделям (привет, Тим) и, конечно, аниматоры компьютерных эффектов (привет, Майк, Стив и Тоня).) А между прочим, не мог ли бы я сделать это побыстрее, потому что, надо же, у нас есть специально созданный тест для проверки, чтобы показать директорам (привет, Поль и Гетан), руководителю отдела спецэффектов (привет, Дейв), и все ждут решения главы отдела художественной анимации (привет, Питер). Никакой срочности, понимаете ли, но...
Я оказался в некотором затруднении. Я довольно уверенно и быстро могу написать программу на C++. Но, к несчастью, не знаю языка Perl. Ну что же, прочитаю книгу, подумал я. Но эта книга не должна быть большой, по крайней мере сейчас. И в ней не должно быть слишком много информации. Я, конечно, должен знать все, но это - позже. Как-никак, это шоу-бизнес: директорам нужно провести тесты, художники ждут утилиту, а продюсеру вообще необходим 48-часовой рабочий день. Мне не нужна была самая лучшая книга по языку Perl - хватило бы просто правильной книги, которая не даст сбиться с пути праведного.
Такой книгой для меня оказалась книга Рендала Шварца (Randal Schwartz) Learning Perl. С ней можно было разобраться в основных вопросах и начать работу, книга была довольно веселой. Конечно, лишь настолько, насколько веселой может быть компьютерная книга. В ней была пропущена куча всяких полезных вещей. Но в то же время мне они и не были нужны - моей задачей было просто заставить работать свои сценарии на языке Perl.
Со временем я с грустью осознал, что третья редакция книги C++ Premier не может выступить в той же роли для того, кто захотел изучить язык C++. Она просто стала слишком объемной. Конечно, это великолепная книга. Особенно - ее третье издание, написанное в соавторстве с Джози Лайои (Josee Lajoie). Но для изучения языка C++ "как раз вовремя" книга получилась слишком сложной. Именно по этой причине я решил написать новую книгу.
Вероятно, вы думаете, что C++ - не Perl. Это действительно так. А эта книга - не книга Learning Perl. Она посвящена изучению языка C++. Настоящий вопрос в том, как можно отбросить почти тысячу страниц и по-прежнему утверждать, что она чему-то может научить?
1. Уровень детализации. В компьютерной графике уровень детализации определяет, насколько точно просчитывается изображение. У хана, который скачет на коне в левом углу экрана, должны быть лицо, глаза, волосы, тень, одежда и так далее. Хан - это вам не скала, эти изображения не нужно просчитывать с одинаковой степенью подробности. Примерно так же сжат и уровень детализации в этой книге. По моему мнению, в книге C++ Premier представлено одно из наиболее полных и удобочитаемых описаний перегрузки операторов (я имею право так говорить, так как его написала Джози). Это описание вместе с примерами программ заняло 46 страниц. Здесь теме перегрузки операторов уделены 2 страницы.
2. Базовый язык. Когда я был редактором журнала C++ Report, половина моей работы по редактированию состояла в выборе материалов, которые не будут помещены в номер. Это справедливо и для данной книги. Материал разбит по видам задач программирования. Возможности языка показаны в решении отдельных задач. У меня не было задачи, решить которую помогло бы множественное или виртуальное наследование, поэтому здесь я их не описываю. Однако, чтобы реализовать класс-итератор, потребовалось ввести вложенные типы. Операторы преобразования классов можно очень легко использовать неверно и их применение сложно объяснить, поэтому о них я тоже решил не писать. И так далее. Выбор и порядок описания возможностей языка всегда открыт для критики. Это мой выбор и моя ответственность.
3. Количество примеров программ. В книге C++ Premier сотни страниц подробно рассмотренного кода, объектно-ориентированная система текстовых запросов и около полудюжины полностью реализованных классов. Хотя текст данной книги связан с кодом программ, набор примеров не так богат, как в книге C++ Premier. Чтобы как-то это компенсировать, решения ко всем упражнениям собраны в приложении А. Дебора Лафферти (Deborah Lafferty), мой редактор, сказала: "Если вы пытаетесь что-то быстро выучить, то, чтобы подкрепить полученные знания, нужно иметь все ответы на кончиках пальцев".
Структура книги
Книга состоит из семи глав и двух приложений. В главе 1 описаны стандарты языка на примере создания простой интерактивной программы, а также встроенные типы данных, стандартные операторы, библиотечные классы vector и string, условные операторы и операторы циклов, библиотека ввода-вывода iostream. Классы vector и string я представил в этой главе потому, что отдаю им предпочтение перед встроенным типом массивов и символьными строками в стиле C.
В главе 2 поясняются вопросы разработки и использования функций, описаны различные виды функций, используемые в C++: подставляемые, перегружаемые функции, шаблонны функций, а также указатели на функции.
В главе 3 описано то, что обычно называют стандартной библиотекой шаблонов (Standard Template Library - STL): набор классов-контейнеров (классы vector, list, set, map) и алгоритмы общего назначения для работы с ними, такие как sort(), copy() и merge(). В приложении Б представлен алфавитный перечень наиболее распространенных обобщенных алгоритмов и приведены примеры использования каждого из них.
Вашей основной работой как программиста на C++ будет создание классов и объектно-ориентированных иерархий классов. В главе 4 описаны разработка и использование возможностей языка C++, связанных с классами, для создания типов данных, специфичных для области вашего приложения. Например, в студии Dreamworks Animation, где я работал консультантом, разрабатывались классы для четырехканальной компоновки изображений и других подобных задач. В главе 5 показано, как расширить конструкцию класса для поддержки семейств связанных классов в объектно-ориентированной иерархии. Например, вместо разработки восьми независимых классов для компоновки изображения мы определили иерархию для выполнения задачи компоновки с использованием наследования и динамического связывания.
Шаблонам классов посвящена глава 6. Шаблон класса представляет собой набор директив для создания класса, его параметрами являются один или несколько типов или значений. Например, параметром класса vector может быть тип элементов, которые в нем содержатся. Параметром для класса buffer может быть не только тип его элементов, но и размер буфера. В этой главе рассмотрена реализация шаблона класса для представления бинарного дерева.
И, наконец, в главе 7 показано, как использовать возможности языка C++ по обработке исключительных ситуаций и как ввести эти функции в иерархию классов стандартных библиотечных исключений. В приложении А представлены решения к упражнениям. В приложении Б показан пример программы и описаны самые распространенные обобщенные алгоритмы.
Замечания к исходным текстам программ
Полные исходные тексты программ, разработанных в книге, а также решения к упражнениям доступны для загрузки с Web-узла издательства Addison Wesley Longman (www.awl.com/cseng/titles/0-201-48518-4) и с моей домашней страницы (www.objectwrite.com). Весь код был проверен в средах Visual C++ 5.0 с компилятором Intel C++ и Visual C++ 6.0 с компилятором Microsoft C++. Для компиляции на вашей системе, возможно, потребуется сделать небольшие поправки в исходных текстах программ. Если вы будете вносить изменения, пришлите мне их список ([email protected]), а я добавлю его вместе с вашим именем в файл изменений, которым дополняются исходные тексты решений к упражнениям. (Обратите внимание на то, что полные исходные тексты не приводятся в книге.)
Благодарности
Моя особая благодарность Джози Лайои (Josee Lajoie), соавтору третьего издания книги C++ Premier. Она оказала неоценимую помощь своими проницательными комментариями к черновикам этой книги. Отдельное спасибо Дейву Слейтону (Dave Slayton) за просмотр текста книги и исходных текстов программ с остро заточенным зеленым карандашом, а также Стиву Виноски (Steve Vinoski) за его сочувственные, но твердые комментарии к черновикам книги.
Традиционно здесь я отмечаю доктора Кловиса Тондо (Clovis Tondo): он неоднократно просматривает каждую из моих книг, издаваемых в Addison-Wesley, после его поправок тексты становились только богаче. Еще раз, спасибо ему.
Спасибо тем, кто написал отзывы о книге для издательства Addison-Wesley. Очень помогли Тим Бадд (Tim Badd) и Роберт Мартин (Robert Martin). Спасибо, ребята, я не знал! Пьер Кардинал (Pierre Cardinal), Марк Чирс (Mark Cheers), Стив Эдвардс (Steve Edvards), Майк Кид (Mike Kidd), Том Лайонс (Tom Lyons) и Альберт Тенбуш (Albert Tenbusch) давали комментарии к первому и второму черновикам книги. Я до сих пор точно не понял, кто, что и когда сказал, но все же, спасибо!
Особая благодарность команде редакторов издательства Addison-Wesley: Деборе Лафферти (Deborah Lafferty), которая оказывала существенную поддержку всему проекту с самого начала. Бетси Хардингер (Betsy Hardinger), которая сделала книгу намного более удобочитаемой. И директору производства Джону Фулеру (John Fuller), который провел нас по пути от рукописи до книги в переплете.
Во время создания этой книги я работал в качестве независимого консультанта, постоянно переключаясь между книгой и несколькими (достаточно) понимающими клиентами. Хочу поблагодарить Колина Липворта (Colin Lipworth), Эдвина Леонарда (Edwin Leonard) и Кеннета Мейера (Kenneth Meyer) за их терпение и добросовестность.
Источники дополнительной информации
С моей абсолютно предубежденной точки зрения, две лучшие книги-введения в язык C++ - это книга C++ Premier Липмана (Lippman) и Лайои (Lajoie), а также книга The C++ Programming Language Страуструпа (Stroustrup), обе в третьем издании. Я буду постоянно направлять читателя к этим книгам за более подробными объяснениями. В тексте также цитируются следующие книги. (Более полная библиография приведена в книгах C++ Premier и The C++ Programming Language.)
[LIPPMAN98] Lippman, Stanley, and Josйe Lajoie, C++ Primer, 3rd Edition, Addison Wesley Longman, Inc., Reading, MA (1998) ISBN 0-201-82470-1.
[LIPPMAN96a] Lippman, Stanley, Inside the C++ Object Model, Addison Wesley Longman, Inc., Reading, MA (1996) ISBN 0-201-83454-5.
[LIPPMAN96b] Lippman, Stanley, Editor, C++ Gems, a SIGS Books imprint, Cambridge University Press, Cambridge, England (1996) ISBN 0-13570581-9.
[STROUSTRUP97] Stroustrup, Bjarne, The C++ Programming Language, 3rd Edition, Addison Wesley Longman, Inc., Reading, MA (1997) ISBN 0-201-88954-4.
[SUTTER99] Sutter, Herb, Exceptional C++, Addison Wesley Longman, Inc., Reading, MA (2000) ISBN 0-201-61562-2.