Table Of ContentС Е Р ИЯ
ШШ^ШШ^ 00(o)(§(o)S
С^ППТЕР'
штт^
Т. А. Павловская, Ю. А. Щупак
C++
Объектно - ориенти ое ннавор
программирование
ум киткарП
Допущено ом втсретсиниМия навозарбо Российской Федерации в ве тсечак
го онбечу пособия ля дов тнедутсих шсых ынвбечузаведений, ся хищюачубо
по ию нелварпанки вотогдопых ннаворимолпидов тсилаицепс
«ка итамрофнИая ньлеи а»ткиинлхсеитчыв
300.piter.com
Издательская программа
300 лучших учебников для высшей школы
в честь 300-летия Санкт-Петербурга
осуществляется при поддержке Министерства образования РФ
1^ППТЕР'
Москва • Санкт-Петербург • Нижний Новгород • Воронеж • Ростов-на-Дону
Новосибирск • Екатеринбург • Самара • Киев • Харьков • Минск
2006
ББК 32.973-018.1
УДК 681.3.06
П12
Рецензенты;
Смирнова Н. Н., зав. кафедрой вычислительной техники Балтийского государственного
технического университета «Военмех» им. Д.Ф. Устинова,
кандидат технических наук, профессор
Трофимов В. В., зав. кафедрой информатики Санкт-Петербургского
государственного университета экономики и финансов,
доктор технических наук, профессор
ая ксволваП Т. А., ак пуЩ Ю. А.
П12 C++. Объектно-ориентированное е:инавориммаргорп м.укиткарП — СПб.:
р,етиП 2006. — 265 с: ил.
ISBN 5-94723-842-Х
ум киткарП ен чанзандерп ля д студентов, их щюачузи ык зя C++ на ах ранимес ли и само
стоятельно. Классы, ы,нолбаш е,инаводелсан я,инечюлкси ая нтраднатсбиблиотека, UML, пецнок
ии ц ой нммаргорп ии ренежни (software engineering) и паперны ия навориткеорп ся тюавиртамссар
на х,аремирп сопровождаемых ми ымидохбоен ми иксечитероет }едевси.мяш ся тюаджусбО алго
ритмы, мы еирпки далтои сы орпова.втсечак По ой джакме етгю едевирппо 20 ов тнаиравзаданий.
Допущено ом втсретсиниМ ия навозарбо ой ксйиссоРии царедеФ в ве тсечак учебного ия босоп
ля д студентов их шсыв ых нбечу заведений, ся хищюачубо по ию нелварпан «ка итамрофнИ и ыв
ая ньлетилсичтехника».
ББК 32.973-018.1
УДК 681.3.06
Информация, содержащаяся в данной е,гинк на ечулоп из в,окинчотси ых меавиртамссар издательством ак к
е.ынжедан ем Т не е,енем ея ми в ду ив ые нжомзов ие ксечеволеч ли и технические ошибки, во тсьлетадзи не
ет жом ть аворитнараг абсолютную точность и ту онлоп ых мидовирп ий недевс и не ет сен ответственности за
ые нжомзовошибки, связанные с ем инавозьлопсии.гинк
ISBN 5-94723-842-Х © АО Зий ксьлетадзИдом «Питер», 2006
Краткое содержание
Предисловие 9
Семинар 1. Классы 12
Семинар 2. Наследование 58
Семинар 3. Шаблоны классов. Обработка исключительных ситуаций 105
Семинар 4. Стандартные потоки 143
Семинар 5. Файловые и строковые потоки. Строки класса string 181
Семинар 6. Стандартная библиотека шаблонов 196
Приложение. Паттерны проектирования 241
Литература 260
ый нтивафлА указатель 261
Содержание
Предисловие 9
От издательства 11
Семинар 1. Классы 12
Появление ОП О— реакция на кризис программного обеспечения 12
Критерии качества декомпозиции проекта 13
то Чпринесло с собой ОП О 14
От структуры — к классу 16
ча адаЗ 1.1. Поиск в массиве структур 16
Отладка программы 25
Инициализаторы конструктора 27
Конструктор копирования 28
Перегрузка операций 29
Перегрузка операций инкремента 30
Перегрузка операции присваивания 31
Статические элементы класса 32
Задача 1.2. Реализация класса треугольников 33
Этап 1 34
Тестирование и отладка первой версии программы 41
Этап 2 42
Этап 3 44
ап тЭ 4 48
Задания 53
Семинар 2. Наследование 58
Наследование классов 58
Замещение функций базового класса 59
Конструкторы и деструкторы в производном классе 60
Устранение неоднозначности при множественном наследовании 61
Доступ к объектам иерархии 62
Виртуальные методы . 63
Абстрактные классы. Чисто ые ньлаутривды отем 64
ие нажредоС
Отношения между классами. Диаграммы классов на языке UML 65
Ассоциация 66
Наследование 67
Агрегация 67
Зависимость 68
Проектирование программы с учетом будущих изменений 69
Задача 2.1. Функциональный калькулятор 72
Задача 2.2. Продвинутый функциональный калькулятор 81
Задача 2.3. Работа с объектами символьных и шестнадцатеричных строк . . .. 88
Задания 102
Семинар 3. Шаблоны классов. Обработка
исключительных ситуаций 105
Шаблоны классов 105
Определение шаблона класса 106
Использование шаблона класса 107
Организация исходного кода 107
Параметры шаблонов 108
Специализация 110
Использование классов функциональных объектов
ля д настройки шаблонных классов 110
Разработка шаблонного класса ля д представления
разреженных массивов 112
Задача 3.1. Шаблонный класс ля дразреженных массивов 113
Обработка исключительных ситуаций 119
Определение исключений 120
ат вхереП исключений 121
Неперехваченные исключения 122
Классы исключений. Иерархии исключений 123
Спецификации исключений 124
Исключения в конструкторах 125
Исключения в деструкторах 129
Задача 3.2. Шаблонный класс векторов (динамических массивов) 129
Задания 141
Семинар 4. Стандартные потоки 143
Потоковые классы 143
Классы стандартных потоков 144
Заголовочные лы йаф библиотеки ввода/вывода C++ 144
Объекты и методы стандартных потоков ввода/вывода 144
Обработка ошибок потоков 147
Перегрузка операций извлечения и вставки ля д типов,
определенных программистом 148
Задача 4.1. Разработка потоковых классов, поддерживающих
ввод/вывод кириллицы 149
Задача 4.2. Первичный ввод и поиск информации в базе данных 166
Задания 173
8 ие нажредоС
Семинар 5. Файловые и строковые потоки.
Строки класса string 181
Файловые потоки 181
Строковые потоки 185
Строки класса string 186
Задача 5.1. Подсчет количества вхождений слова в текст 189
Задача 5.2. Вывод вопросительных предложений 191
Задания 193
Семинар 6. Стандартная библиотека шаблонов 196
Основные концепции STL 196
Контейнеры 197
Итераторы 197
Общие свойства контейнеров 200
Алгоритмы 201
Использование последовательных контейнеров 202
Задача 6.1. Сортировка вектора 204
Шаблонная функция print() ля д да овыв содержимого контейнера 205
Адаптеры контейнеров 206
Использование алгоритмов . 208
Использование ассоциативных контейнеров 215
Множества 215
Словари 217
Задача 6.2. Формирование частотного словаря 218
Задача 6.3. Морской бой 220
Задания 233
Приложение. Паттерны проектирования 241
Порождающие паттерны 243
Структурные паттерны 245
Паттерны поведения 247
рн еттаПСтратегия (Strategy) 252
Паттерн Компоновщик (Composite) 255
Литература 260
Алфавитный указатель 261
Предисловие
Перед вами практикум по изучению объектно-ориентированного программиро
вания (ООП). Наша цель — научить читателя самостоятельно создавать грамот
ные и по возможности профессиональные программы на C++.
В подавляющем большинстве учебников по C++ излагаются конструкции языка
с иллюстрациями на примерах. Любой программист, работавший над реальными
проектами, понимает, что знания синтаксиса и правил выполнения операторов
далеко не достаточно для того, чтобы писать программы приемлемого качества.
Это особенно справедливо для такого многогранного языка, как C++.
Если вы не знакомы с основами ООП и с базовыми концепциями программ
ной инженерии (software engineering), то написанная вами программа, если и за
работает, скорее всего, будет неудобной для сопровождения и модификации,
а повторное использование программного кода окажется почти невозможным.
Именно поэтому вопросам программной инженерии в нашей книге уделяется
особое внимание.
Вот краткий перечень этих вопросов.
• Из каких компонентов — модулей, функций, классов — должна состоять про
грамма?
• Как распределяются обязанности между этими компонентами?
• Как компоненты программы взаимодействуют друг с другом?
• Каким критериям должен удовлетворять программный проект, чтобы го е было
легко сопровождать и модифицировать?
• Как применять шаблоны (паттерны) проектирования для достижения ука
занных целей?
се В эти проблемы рассматриваются на конкретных задачах, причем особая роль
отведена первым двум семинарам, посвященным изучению базовых концепций
ООП. Здесь особенно подробно разбирается процесс проектирования программы,
активно используются средства отладки и тестирования. Иногда мы специально
вносим в исходный текст программы ошибку или проявляем «забывчивость»,
чтобы продемонстрировать возникающие последствия и, кроме того, привить
1 о предисловие
читателю вкус к аналитической работе детектива, идущего по следу коварного
«преступника» — программной ошибки.
Для эффективного восприятия новых технологических идей сегодня не обойтись
без знания основ унифицированного языка моделирования UML, уже ставшего
стандартным средством представления проектных решений. Поэтому в практи
куме показано применение диаграмм классов языка UML для отображения взаи
моотношений между классами.
Кроме чисто учебных задач в практикуме рассматриваются и более сложные,
изучение которых, как мы надеемся, ускорит вхождение читателя в мир про
фессионального программирования. Например, одной из реальных проблем при
разработке программного обеспечения является необходимость адаптации биб
лиотеки стороннего производителя к потребностям заказчика. В четвертом семи
наре рассматривается адаптация стандартной библиотеки Microsoft для обеспе
чения ввода/вывода кириллицы на платформе Windows.
Эта книга является второй частью практикума, являющегося дополнением к учеб
нику Т. А. Павловской «C/C++. Программирование на языке высокого уровня»
(«Питер», 2001, 2003)^ В дальнейшем для краткости мы будем называть его
«учебник». По содержанию книга соответствует материалам второй и третьей
частей учебника, но выходит довольно далеко за го е рамки.
В начале каждого семинара приведены ссылки на разделы учебника, содержа
щие соответствующий материал. Тем не менее при разборе текстов программ
поясняются все использованные в них возможности языка, поэтому практикум
можно и нужно рассматривать как самостоятельное издание. Тексты заданий на
лабораторные работы частично соответствуют учебнику, а частично переработа
ны для более углубленного изучения материала.
Все ключевые слова, стандартные типы, константы, функции, макросы и классы,
описанные в книге, можно найти по предметному указателю, что позволяет ис
пользовать ее в качестве справочника.
Средства C++, рассматриваемые в данной книге, соответствуют стандарту ANSI
ISO/IEC 14882 (1998). Из распространенных компиляторов ему в достаточной
степени соответствуют, например, Microsoft Visual C++ 6.0 (ОС Windows) и gcc
(GNU С Compiler — ОС Linux, Cygwin — ОС Windows). Приведенные в книге
примеры программ протестированы с помощью первого из указанных средств.
Практикум поддержан проектом «Разработка концепции и научно-методического
обеспечения регионального центра целевой подготовки разработчиков программ
ного обеспечения и компьютерных технологий» программы Министерства обра
зования Российской Федерации «Государственная поддержка региональной на
учно-технической политики высшей школы и развития ее научного потенциала»
на 2003 д.ог В основу книги положены семинары, проводимые авторами в Санкт-
Петербургском государственном университете информационных технологий,
механики и оптики (СПбГУИТМО).
^ ая вреПга ма иункикткарп— «C/C++.е»ииое ан вроруитммкауфорртпС — ла на ыебщупыв
ом втсьлетадзи«р»етиП в 2002 у.дог