Язык С++. Курс объектно-ориентированного программирования
3-е издание
Уолтер Савитч
Данная книга представляет собой учебный курс по программированию и вычислительной технике, предназначенный для студентов, изучающих язык программирования C++. Для освоения излагаемого материала не требуется наличие предварительного опыта в программировании или знаний по математике, выходящих за рамки школьной программы по алгебре. Книгу можно использовать и как учебник, положенный в основу курса языка C++ для студентов, уже прослушавших другие курсы по программированию. Материал в книге изложен с учетом последних изменений стандарта языка C++. Книга снабжена множеством примеров и упражнений, обеспечивающих закрепление студентами усвоенного материала.
Предисловие
Эта книга задумана как начальный курс по программированию и вычислительной технике, предназначенный для студентов, изучающих язык программирования C++. Чтобы освоить излагаемый материал, не требуется иметь опыт в программировании или математические знания, выходящие за рамки школьной программы по алгебре. Книгу можно использовать и как учебник, положенный в основу курса по C++ для студентов, уже прослушавших другие курсы по программированию.
Читатель, знакомый с предыдущими изданиями книги, может прочитать только следующий раздел, в котором поясняются изменения, сделанные в настоящем, третьем, издании, а остальную часть предисловия пропустить. Для тех же, кто читает книгу в первый раз, здесь приводится обзор ее содержимого.
Изменения, внесенные в третье издание
В третьем издании книги автор придерживается той же философии программирования и такой же последовательности изложения тем, что и во втором. Преподаватели, уже использовавшие второе издание, могут продолжать чтение курса почти без изменений. Потребуется лишь несколько обновить некоторые коды, но в большинстве случаев общая смысловая нагрузка примеров остается той же, что и в предыдущем издании. Некоторые изменения, внесенные в излагаемый материал, связаны с обновлением стандартов языка C++. В третьем издании добавлены также новые темы. Дополнительные разделы освещают последние изменения стандарта ANSI/ISO языка C++, включая подробное описание новых типов string и bool, определение понятия пространства имен и обсуждение вопросов его использования, а также описание новых заголовочных файлов стандартных библиотек. Главы, посвященные шаблонам и наследованию, полностью переписаны, что сделало
их более полными и доступными. В новое издание включена также дополнительная глава, в которой рассматривается обработка
Свобода выбора в порядке следования тем
В большинстве учебников по основам C++ предлагается подробная и строгая программа, которой должны придерживаться преподаватели, использующие их в курсах лекций. Данную же книгу каждый преподаватель может приспособить к собственной манере изложения материала, вместо того чтобы подстраиваться самому. Язык C++ и основные методы программирования излагаются в книге так, чтобы материал был понятен студентам начальных курсов. Однако здесь нет жестких предписаний, касающихся порядка изложения тем, которого должны придерживаться преподаватели в своих курсах лекций. Порядок изложения глав и разделов может быть легко изменен, причем это не повлияет на целостность восприятия материала книги. Подробности, касающиеся этих изменений, приведены в одном из последующих разделов предисловия, где речь идет о возможности гибкого выбора порядка тем.
Хотя в этой книге описывается использование библиотек и объясняется, насколько они важны, нестандартные библиотеки вам не потребуются. Речь идет лишь о тех библиотеках, которые входят в состав, по сути, всех реализаций языка C++.
Стандарт ANSI/ISO языка C++
Примеры, используемые в книге, в настоящем издании обновлены и приведены в соответствие с новым стандартом ANSI/ISO для языка C++. Среди прочих изменений можно отметить использование новых имен библиотечных файлов, а также объяснение понятия пространства имен и обучение его применению. В материалах предыдущего издания уже использовались новые типы string и bool; здесь их использование расширено.
К сожалению, многие компиляторы все еще не соответствуют (или не полностью соответствуют) новому стандарту. Поэтому, хотя материал излагается согласно новому стандарту, это делается с некоторыми предосторожностями, чтобы можно было приспособиться к старым компиляторам. Например, есть приложение с таблицей, в которой приводится соответствие между старыми и новыми именами библиотечных заголовочных файлов. Если компилятор не использует новых имен библиотек, в программы можно подставить старые. В книгу включены также описания других незначительных изменений, которые следует внести в тексты программ, чтобы они были понятны старым компиляторам. Желательно делать эти изменения лишь тогда, когда они совершенно необходимы, и при этом стараться как можно точнее придерживаться нового стандарта.
Раннее знакомство с классами
В книгах по программированию используется по крайней мере два способа знакомства с классами: книга учит студентов либо конструировать собственные классы, либо использовать уже созданные ранее. Настоящая книга разъясняет читателю не только то, как использовать классы на ранних стадиях обучения, но и как создавать их самостоятельно. Для эффективного создания классов студенту понадобятся такие базовые инструменты, как некоторые простые управляющие структуры и определения функций. Поэтому уже в начальных главах (2-4) даются соответствующие основные понятия, после чего сразу же начинается изложение материала, посвященного классам. В главе 5, "Введение в объекты и классы на примере потоков ввода-вывода", при обучении работе с классами используются файловые потоки ввода-вывода. В главе 6, "Определение классов и абстрактных типов данных", рассматривается возможность написания собственных классов.
Для обучения работе с классами используется постепенный подход. Сначала студенты учатся писать некоторые простейшие классы, затем вводятся конструкторы, далее - понятие перегрузки операторов, затем рассматривается перегрузка операторов ввода-вывода << и >> и т.д. Такое дозированное изложение материала оберегает читателя от чрезмерной нагрузки сложными конструкциями и концепциями. Однако одна из целей книги - как можно скорее научить читателя создавать реальные классы, а не тратить время на написание искусственно упрощенных. К концу главы 8, "Инструменты для определения абстрактных типов данных", студенты смогут писать, по сути, те же классы, которые понадобятся им по окончании курса.
Вопросы наследования кратко изложены в главе 5, "Введение в объекты и классы на примере потоков ввода-вывода", которая знакомит читателя с этим понятием. Однако собственные производные классы студенты научатся писать лишь к концу книги, поскольку на начальных этапах изучения C++ трудно придумать естественные примеры, интенсивно использующие наследование и производные классы. Глава 15, "Наследование", учит студентов определять и использовать производные классы, включая использование виртуальных функций. Возможно, некоторые преподаватели захотят перенести этот материал на второй курс.
Даже если отложить полное изучение наследования, кто-то может сказать, что классы, которые вводятся чуть ли не в самом начале книги, являются слишком сложными, и усомниться, стоит ли вводить их на столь ранних этапах первого курса по программированию. В конечном счете, кроме основных понятий, связанных с переменными-членами и функциями-членами, студенты первых курсов уже в процессе начального изучения книги познакомятся со следующими темами: открытые (public) и закрытые (private) члены, перегрузка функций и операторов, дружественные функции, возврат ссылок (способствующий перегрузке операторов ввода-вывода << и >>), конструкторы и автоматическая инициализация, применение конструкторов при преобразовании типов, а также с другими более мелкими вопросами. Кто-то может решить, что на ранних стадиях обучения не стоит излагать студентам так много материала. Однако материал был протестирован
автором на практике, и стало ясно, что без изложения всех этих тем примеры становятся слишком далеки от реальности. Кроме т
Приводя аргументы в пользу раннего обучения работе с классами, автор отдает себе отчет, что далеко не все захотят вводить понятие класса так рано, как это делает он. Поэтому книга написана так, чтобы преподаватели смогли отложить освещение этой темы. О том, как это можно сделать, речь идет ниже, в разделе, посвященном гибкости изложения материала.
Доступность
В книге недостаточно просто изложить нужные темы в нужном порядке. Недостаточно и такого изложения материала, чтобы он был легко и правильно воспринят преподавателем или опытным программистом. Книга должна быть доступна начинающим студентам, и, памятуя об этом, автор старался писать ее в манере, понятной и близкой им. Отзывы многих студентов, работавших с предыдущими изданиями книги, подтверждают, что такой стиль помогает усваивать материал и, кроме того, доставляет удовольствие от изучения.
В книге предлагается множество примеров, советов и предостережений начинающему программисту, для удобства помеченных пиктограммами.
Этой пиктограммой выделены советы начинающему программисту.
Эта пиктограмма помечает материал, рассказывающий о наиболее часто возникающих проблемах у начинающих программистов. Внимательно отнеситесь к этому материалу - в будущем это позволит вам избежать множества ошибок. Ведь всегда лучше учиться на чужих ошибках, чем на собственных (впрочем, бывают люди, которые не учатся даже на собственных ошибках).
Эта пиктограмма указывает на примеры решения программных задач с использованием излагаемого в главе материала.
Дополнительные темы
Многие дополнительные темы книги стали частью стандартного курса CS1. Даже если они не входят в этот курс, их полезно представить в учебнике хотя бы в качестве дополнительного материала. В данной книге вниманию читателя предлагаются различные дополнительные темы, которые могут быть как включены в курс, так и оставаться материалом для дополнительного изучения. Здесь подробно описываются шаблоны C++, наследование (включая виртуальные функции) и обработка исключений. В третьем издании две главы, посвященные шаблонам и обработке исключений, полностью переписаны и добавлена глава, в которой рассматривается обработка исключений.
Разделы с краткими выводами
В каждой главе есть отдельный раздел, в котором перечислены основные положения главы.
Упражнения для самоконтроля
В каждой главе приведены упражнения, которые помогают проверить, правильно ли усвоены стратегически важные положения. Ответы к этим упражнениям приводятся в конце глав.
Опробование материала на практике
Первыми двумя изданиями книги воспользовалось свыше 100 тыс. студентов. Многие студенты и преподаватели присылали автору отзывы, в которых отмечались положительные и отрицательные стороны книги. Большинство отзывов были положительными и свидетельствовали о том, что книга понравилась, хотя встречались и определенные замечания. Все пожелания читателей были тщательно рассмотрены автором. Отзывы принесли большую пользу и были учтены при пересмотре содержания этого издания с тем, чтобы оно еще более соответствовало потребностям студентов и преподавателей.
Гибкая последовательность изложения тем
Материал книги представлен таким образом, чтобы предоставить преподавателям определенную свободу в последовательности его изложения. Чтобы эта гибкость стала нагляднее, автор предлагает несколько вариантов упорядочения тем, в каждом из которых сохраняется последовательность изложения. Чтобы помочь в поиске нужной вам последовательности, в конце предисловия приведена схема зависимости материала глав и разделов. На ней изображены различные способы упорядочения глав и разделов, при которых не теряется последовательность изложения материала.
Вариант 1. Позднее изучение классов
Прежде чем начинать знакомство с классами, изучается весь традиционный курс языка ANSI C. Единственная тема, которая близка идеологии C++ и изучается до введения понятия классов, - использование потоков для ввода-вывода. Так как в потоках ввода-вывода применяется понятие пространства имен, оно включено в первые несколько глав (те из читателей, кто пользуется старыми компиляторами, могут опустить ссылки на пространства имен).
Основные понятия: главы 1-5 и 7 (главу 6, в которой определяются классы, пропускаем). В них описываются все управляющие структуры, определения функций и основы файлового ввода-вывода.
Массивы: глава 9, за исключением раздела 9.4, в котором рассматривается использование классов. Глава 10, за исключением раздела 10.2, в котором описывается класс string стандартной библиотеки шаблонов C++ (Standard Template Library - STL).
Указатели и динамические массивы: глава 11, за исключением раздела 11.3, в котором излагается материал по классам.
Рекурсия: глава 12, за исключением примера программы, приведенного в конце главы (в качестве альтернативного варианта рекурсия может быть отложена на более поздние этапы курса).
Структуры и классы: главы 6, 8 и последние разделы глав 9-11.
Указатели и связанные списки: глава 14.
Кроме того, остается еще несколько тем.
Шаблоны: глава 13.
Наследование: глава 15.
Обработка исключений: глава 16.
Вариант 2. Раннее изучение классов
Перед изучением классов излагается весь материал по управляющим структурам и основной материал по массивам. Однако описание классов вводится несколько раньше, чем в предыдущей версии построения курса.
Основные понятия: главы 1-5 и 7 (главу 6, в которой определяются классы, пропускаем). В этих главах описываются все управляющие структуры, определения функций и основы файлового ввода-вывода.
Одномерные массивы: глава 9, за исключением раздела 9.4, в котором рассматривается использование классов.
Структуры и классы: главы 6, 8 и последний раздел главы 9.
Многомерные массивы и строки: глава 10.
Указатели и динамические массивы: глава 11.
Рекурсия: глава 12.
Указатели и связанные списки: глава 14.
Кроме того, остается еще несколько тем.
Шаблоны: глава 13.
Наследование: глава 15.
Обработка исключений: глава 16.
Вариант 3. Раннее изучение классов с освоением управляющих структур
Принимается обычный порядок следования тем, за исключением того, что главы 6 и 7 нужно поменять местами.
Дополнительные варианты
Материал первых двух разделов главы 12 (где излагаются основные понятия рекурсии) можно давать в любом месте после главы 4. Первые два раздела по указателям (в главе 11) можно рассматривать до главы 10, в которой описываются многомерные массивы и строки. Большинство начальных разделов главы 13, в которой дается материал по шаблонам функций, могут быть изложены в любом месте после главы 4. Первые два раздела главы 15 (15.1 и 15.2), в которых описываются основы определения и использования производных классов, могут быть изложены в любом месте после главы 10. Другие возможные варианты становятся понятны из схемы зависимости тем, приведенной в конце предисловия.
Вспомогательные материалы
У издателя можно получить представленные ниже вспомогательные материалы.
Программы, включенные в текст. Все эти программы можно найти на Web-узле http://www.awl.com/cssupport.
Кроме того, их можно найти на Web-узле автора по адресу: http://www-cse.ucsd.edu/users/savitch/.
Путеводитель преподавателя.
Содержит многочисленные советы по обучению, контрольные вопросы с ответами и решения многих упражнений по программированию.
Путеводитель предназначен лишь для квалифицированных преподавателей. Его можно получить либо у торговых представителей компании Addison-Wesley, либо послав электронное письмо по адресу: aw.cse@awl.com.
Обратная связь
Автор очень хотел бы получить отзывы читателей, которые помогут ему и далее улучшать представленный в книге материал с тем, чтобы она могла полнее удовлетворять требования читателей. Присылайте, пожалуйста, свои отзывы по следующему адресу: wsavitch@ucsd.edu.
Кроме того, автор желает знать, понравилась ли читателю книга и каковы его предложения и замечания по ее содержанию. Однако он хотел бы сразу предупредить, что не в состоянии давать студентам консультации по электронной почте или оказывать услуги по обучению. На его адрес приходит слишком много подобных писем. В частности, автор не предоставляет решения упражнений, приведенных как в этой книге, так и в других, предлагаемых преподавателями. У него просто не хватит времени отвечать на многочисленные просьбы о помощи такого рода. Кроме того, автор не намерен вмешиваться в учебные планы преподавателей, касающиеся решения студентами задач по программированию. В качестве частичного утешения нуждающимся в такой помощи в книгу включены подробные ответы на вопросы всех проверочных упражнений. Преподавателям предлагаются некоторые ответы к проектам по программированию, которые можно найти в руководстве
преподавателя. Однако этот материал предоставляется только преподавателям колледжей и университетов, использующим э
Благодарности
В подготовке учебника к изданию участвовали многие люди и целые группы, которые вносили различные предложения, занимались обсуждением тех или иных вопросов и оказывали другую помощь. Большая часть первого издания книги была написана во время посещения автором факультета информатики Университета штата Колорадо в Болдере. Работа по написанию оставшейся части первого издания, а также по подготовке второго и третьего изданий проводилась на факультете информатики и вычислительной техники Университета штата Калифорния в Сан-Диего. Автор выражает благодарность этим учебным заведениям, обеспечившим ему все условия для изучения материала и написания книги.
Особой признательности заслуживает Дэвид Тиг (David Teague). Автор благодарен ему за невероятную трудоспособность, глубокое понимание материала и тщательную проработку многих разделов книги. Он участвовал в обновлении материала и приведении его в соответствие со стандартом ANSI/ISO языка C++.
Если благодарить отдельно каждого, кто внес свой вклад в создание книги, с указанием его заслуг, то этот список оказался бы слишком длинным. И хотя все они достойны этого, автор вынужден просто перечислить своих помощников в алфавитном порядке и выразить всем глубочайшую признательность. Рецензии и отзывы к первым двум изданиям оказали огромную помощь при подготовке настоящей книги. Автор благодарит всех, кто представил свои замечания и комментарии к первым двум изданиям. Это Клэр Боно (Claire Bono), Эндрю Барт (Andrew Burt), Карла Чевей (Karla Chaveau), Джоэль Когэн (Joel Cohen), Дуг Косман (Doug Cosman), Джо Фалетти (Joe Faletti), Пауло Франка (Paulo Franca), Лен Гарретт (Len Garrett), Джеррольд Гроссман (Jerrold Grossman), Дэннис Хекман (Dennis Heckman), Боб Холловэй (Bob Holloway), Брюс Джонстон (Bruce Johnston), Томас Джадсон (Thomas Judson), Майкл Кинан (Michael Keenan), Барни Мак-Кейб
(Barney MacCabe), Стив Махони (Steve Mahaney), Майкл Мейн (Michael Main), Джон Марсалья (John Marsaglia), Нат Мартин
Особую признательность автор выражает преподавателям, которые пользуются первыми изданиями. Их отзывы оказались самыми важными среди всех рецензий, полученных этой книгой. В частности, за наиболее ценные замечания, сделанные после использования материала первых изданий в аудитории, автор хотел бы поблагодарить Пауля Кьюба (Paul Kube), Сьюзан Зайтц (Susan Seitz) и Дэвида Тигу (David Teague).
Также огромное спасибо Дэвиду Тигу за его блестящую работу по подготовке руководства для преподавателей.
Автор благодарит издательство Prentice-Hall за то, что оно позволило ему использовать некоторые материалы из его книги Java, An Introduction to Computer Science and Programming, которые вошли в главу 16, "Обработка исключений", настоящего издания.
Автор выражает признательность всем сотрудникам издательства Addison-Wesley, которые помогали ему в работе над книгой. Он благодарит Лизу Калнер (Lisa Kalner) за координацию переговоров с типографией и прекрасную организацию процесса подготовки книги; Диану Фрид (Diane Freed) за блестящую работу, благодаря которой выход издания был осуществлен в сжатые сроки; Фрэнка Руггирелло (Frank Ruggirello) за его помощь и поддержку. Особая благодарность редактору Сьюзан Хартман Салливэн (Susan Hartman Sullivan) за ее ценные замечания и поддержку, благодаря которой третье издание соответствует духу нашего времени.
И наконец, автор благодарит Кристину (Christina) за то, что она позволяла ему допоздна просиживать за работой, оказывала моральную поддержку и даже делала замечания по содержанию книги.