Table Of ContentBRUCEECKEL
CHUCK ALLISON
T h i n k i n g
I8 n
+ +
VolumeTwo:
Practical Programming
------
PEARSON
Prentice
НаН
&РЮС3ККЕЛЬ
ЧАК3ЛЛИСОН
ФlllnОСОфlllЯ
+ +
Практическое
проrраммирование
Москва· Санкт-Петербург· Нижний Новгород· Воронеж
Новосибирск· Ростов-на-Дону . Екатеринбург· Самара
Киев· Харьков· Минск
2004
Брюс Эккель, Чак Эллисон
Философия С++. Практическое программирование
Перевел с английского Е. Матвеев
Главный редактор Е. Строганова
Заведующий редакцией И. Корнеев
Руководитель проекта А. Крузенштерн
Научный редактор Е. Матвеев
Литературный редактор А. Жданов
Иллюстрации М Шендерова.
Художник М Соколинекая, Н. Биржаков
Корректоры Н. Лукина, И. Смирнова
Верстка А. Келле-Пелле
ББК 32.973-018.1
УДК 681.3.06
Эккель Б., Эллисон ч.
э 38 Философия С++. Практическое программирование. - СПб.: Питер, 2004. -
608 с.: ил.
ISBN 5-469-00043-5
Книга отличается от других учебников по С++ новым подходом к изложению материала,
основанным на логике и здравом смысле. Вместо простого перечисления языковых конструкций,
снабженных примерами, авторы стремятся научить читателя мыслить категориями С++. Они
подробно объясняют, почему проектировщики языка принимали то или иное решение, описывают
типичные проблемы и пути их решения.
Во втором томе рассматриваются такие темы, как обработка исключений, стандартная
библиотека С++ (включая потоки ввода!вывода, контейнеры и алгоритмы STL), шаблоны,
множественное наследование, RTТI, автоматизация тестирования и отладки программ, паттерны
проектирования и т. д.
© 2004 MindView, Inc.
© Перевод на русский язык, ЗАО Издательский дом «Питер», 2004
© Издание на русском языке, оформление, ЗАО Издательский дом «Питер», 2004
Права на издание получены по соглашению с Ргепtiсе Hall, Iпс. Upper Sadle River, New Jersey 07458.
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного
разрешения владельцев авторских прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не
менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную
точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги.
ISBN 5-469-00043-5
ISBN 0130353132 (англ.)
000 «Питер Принт». 196105, Санкт-Петербург, ул. Благодатная,д. 67в.
Лицеизия ИД.N!!05784 от 07.09.01.
Налоговая льгота - общероссийский классификатор ПРОДУКЦЮl ОК 005-93, том 2; 953005 - литература учебная.
Подписано в печать 23.06.04. Формат 70><1 00/16. Ус,1. п. л. 73,53. Тираж 3500 ЭКЗ. Заказ N!! 2808.
Отпечатано с готовых диапозитнвов в ФГУП «Печатный двор» им. А. М. Горького МиниcrepcтвaРФ
по дела.\f печатн, теперадиовещaюtЯ и средств массовых коммуникаШiЙ.
19711 О, Санкт-Петербург, Чкаловский пр., 15.
Краткое содержание
..................................................................................... 14
Предисловие
Чаcrь 1. Разработка уcrОЙЧИВblХ сиcrем
Глава 1. Обработка исключений ........................................................ 25
Глава 2. Защитное программирование ............................................... б3
Чаcrь 2. Стандартная библиотека С++
Глава 3. Строки ................................................................................. 93
Глава 4. Потоки ввода-вывода ......................................................... 127
Глава 5. Шаблоны ........................................................................... 183
Глава б. Обобщенные алгоритмы ..................................................... 255
Глава 7. Обобщенные контейнеры ................................................... 330
Чаcrь 3. СпециаЛЬНblе возможноcrи
8. Rm ................................................................................... 425
Глава
Глава 9. Множественное наследование ............................................ 442
Глава 10. Паперны проектирования ................................................ 472
Глава 11. Многопоточное программирование ................................... 531
Список терминов ............................................................................. 59б
Алфавитный указатель .................................................................... БОО
Содержание
Предисловие ..................................................................................... 14
Цели ......................................................................................................................................................... 14
Главы ....................................................................................................................................................... 15
Упражнения .......................................................................................................................................... 17
Исходные тексты ................................................................................................................................ 18
Компиляторы ....................................................................................................................................... 18
Языковые стандарты ......................................................................................................................... 19
Благодарности ..................................................................................................................................... 20
От издательства ................................................................................................................................... 22
Часть 1. Разработка УСТОЙЧИВblХ систем
Глава 1. Обработка исключений ........................................................ 25
Традиционная обработка ошибок ................................................................................................. 26
Запуск исключений ............................................................................................................................ 28
Перехват исключений ....................................................................................................................... 29
Блок try ..................................................................................................................................... 29
Обработчики исключений ................................................................................................. 29
Завершение и продолжение .............................................................................................. 31
Поиск подходящего обработчика .................................................................................................. 31
Перехват любых исключений ........................................................................................... 33
Перезапуск исключения ..................................................................................................... 33
Неперехваченные исключения ........................................................................................ 34
Функция terminate() ........................................................................................................... 34
Функция set_terminate() .................................................................................................... 35
Зачистка ................................................................................................................................................. 36
Управление ресурсами ........................................................................................................ 37
Управление ресурсами на уровне объектов ................................................................ 38
auto_ptr ..................................................................................................................................... 40
Блоки try уровня функций ................................................................................................ 42
Стандартные исключения ................................................................................................................ 43
Спецификации исключений ........................................................................................................... 45
Улучшим спецификации исключений? ........................................................................ 49
Спецификации исключений и наследование .............................................................. 49
Когда спецификации исключений не используются ............................................... 50
Содержание 7
Безопасность исключений ............................................................................................................... 51
Программирование с учетом исключений ................................................................................. 54
Когда лучше обойтись без исключений ........................................................................ 54
Типичные применения исключений .............................................................................. 56
Издержки обработки исключений ................................................................................................ 58
Итоги ....................................................................................................................................................... 60
У пражнения .......................................................................................................................................... 61
Глава 2. Защитное программирование ............................................... б3
Утверждения ........................................................................................................................................ 65
Простая система модульного тестирования .............................................................................. 68
Автоматизация тестирования ........................................................................................... 70
Система TestSuite ................................................................................................................. 73
Комплексы тестов ................................................................................................................. 75
Код TestSuite .......................................................................................................................... 77
Методика отладки .............................................................................................................................. 81
Трассировочные макросы .................................................................................................. 81
Трассировочный файл ........................................................................................................ 82
Поиск утечки памяти ........................................................................................................... 83
Итоги ....................................................................................................................................................... 88
Упражнения .......................................................................................................................................... 88
Часть 2. Стандартная библиотека С++
Глава 3. Строки ................................................................................. 93
Что такое строка? ................................................................................................................................ 94
Создание и инициализация строк С++ ....................................................................................... 95
Операции со строками ...................................................................................................................... 98
Присоединение, вставка и конкатенация строк ......................................................... 98
Замена символов в строках ............................................................................................. 100
Конкатенация с использованием перегруженных операторов ........................... 103
Поиск в строках ................................................................................................................................. 103
Поиск в обратном направлении ..................................................................................... 107
Поиск первого/последнего символа из заданного подмножества .................... 109
Удаление символов из строк ........................................................................................... 11 О
Сравнение строк .................................................................................................................. 112
Строки и характеристики символов ............................................................................ 115
Пример обработки строк ................................................................................................................ 120
Итоги ..................................................................................................................................................... 124
Упражнения ........................................................................................................................................ 124
Глава 4. Потоки ввода-вывода ......................................................... 127
Зачем нужны потоки? ..................................................................................................................... 127
Потоки ввода-вывода ...................................................................................................................... 131
Операторы чтения и записи ............................................................................................ 131
Типичное применение ....................................................................................................... 134
Построчный ввод ................................................................................................................ 137
8 Содержание
Обработка потоковых ошибок ..................................................................................................... 138
Состояние потока ................................................................................................................ 138
Потоки ввода-вывода и исключения ........................................................................... 139
Файловые потоки ввода-вывода ................................................................................................. 140
Пример обработки файлов .............................................................................................. 141
Режимы открытия файла ................................................................................................. 142
Буq>еризация ...................................................................................................................................... 143
Поиск в потоках ввода-вывода .................................................................................................... 145
Строковые потоки ............................................................................................................................ 148
Строковые потоки ввода .................................................................................................. 148
Строковые потоки вывода ............................................................................................... 150
Форматирование в потоках вывода ........................................................................................... 152
Форматные флаги ............................................................................................................... 153
Форматные поля ................................................................................................................. 154
Переменные width, fill и precision ................................................................................. 155
Пример форматирования в потоках вывода ............................................................. 156
Манипуляторы .................................................................................................................................. 159
Манипуляторы с аргументами ....................................................................................... 160
Создание манипуляторов ................................................................................................. 162
Эффекторы ............................................................................................................................ 163
Примеры использования потоков ввода-вывода .................................................................. 165
Сопровождение исходного кода библиотеки классов ........................................... 165
Обнаружение ошибок компиляции .............................................................................. 169
Простая программа ведения журнала ......................................................................... 171
Интернационализация .................................................................................................................... 175
Расширенные потоки ......................................................................................................... 175
Локальный контекст .......................................................................................................... 177
Итоги ..................................................................................................................................................... 179
Упражнения ........................................................................................................................................ 179
Глава 5. Шаблоны ........................................................................... 183
Параметры шаблонов ...................................................................................................................... 183
Нетиповые параметры шаблонов .................................................................................. 184
Аргументы шаблонов по умолчанию ........................................................................... 185
Шаблоны как параметры шаблонов ............................................................................. 187
Ключевое слово typename ................................................................................................ 191
Ключевое слово template .................................................................................................. 193
Вложенные шаблоны ......................................................................................................... 194
Шаблоны функций ........................................................................................................................... 196
Определение типа аргументов в шаблонах функций ............................................. 197
Перегрузка шаблонов функций ..................................................................................... 200
Получение адреса сгенерированного шаблона функции ...................................... 201
Применение функции к последовательным контейнерам STL .......................... 204
Приоритеты шаблонов функций ................................................................................... 207
Содержание 9
Специализация шаблонов ............................................................................................................. 208
Явная специализация ........................................................................................................ 208
Неполная специализация и приоритеты шаблонов классов ............................... 210
Пример .................................................................................................................................... 211
Ограничение объема генерируемого кода .................................................................. 214
Разрешение имен .............................................................................................................................. 217
Имена в шаблонах ............................................................................................................... 218
Шаблоны и дружественные функции ......................................................................... 222
Идиомы программирования с применением шаблонов ..................................................... 226
Характеристики ................................................................................................................... 226
Политики ............................................................................................................................... 231
Псевдорекурсия и подсчет объектов ............................................................................ 232
Шаблонное метапрограммирование .......................................................................................... 235
Программирование на стадии компиляции .............................................................. 235
Шаблоны выражений ........................................................................................................ 242
Модели компиляции шаблонов ................................................................................................... 247
Модель с включением ....................................................................................................... 248
Явная специализация ........................................................................................................ 248
Модель с разделением ....................................................................................................... 250
Итоги ..................................................................................................................................................... 251
Упражнения ........................................................................................................................................ 252
Глава б. Обобщенные алгоритмы ..................................................... 255
Первый взгляд ................................................................................................................................... 255
Предикаты ............................................................................................................................. 258
Потоковые итераторы ....................................................................................................... 260
Сложность алгоритмов ..................................................................................................... 261
Объекты функций ............................................................................................................................ 262
Классификация объектов функций .............................................................................. 264
Автоматическое создание объектов функций .......................................................... 265
Адаптируемые объекты функций ................................................................................. 267
Другие примеры объектов функций ............................................................................ 268
Адаптация указателей на функции ............................................................................... 274
Написание пользовательских адаптеров для объектов функций ...................... 279
Каталог алгоритмов STL ................................................................................................................ 282
Вспомогательные инструменты для создания примеров ..................................... 284
Устойчивая и неустойчивая сортировка .................................................................... 285
Заполнение интервалов и генерирование значений ............................................... 287
Подсчет ................................................................................................................................... 288
Копирование и перестановки ......................................................................................... 289
Поиск и замена ..................................................................................................................... 293
Сравнение интервалов ...................................................................................................... 299
Удаление элементов ........................................................................................................... 301
Сортировка и операции с отсортированными интервалами ............................... 304
Операции с кучей ................................................................................................................ 312
10 Содержание
Применение операции к каждому элементу интервала ........................................ 313
Числовые алгоритмы ......................................................................................................... 319
Вспомогательные алгоритмы .......................................................................................... 322
Создание пользовательских алгоритмов .................................................................................. 323
Итоги ..................................................................................................................................................... 324
Упражнения ........................................................................................................................................ 325
Глава 7. Обобщенные контейнеры ................................................... ЗЗО
Контейнеры и итераторы ............................................................................................................... 330
Первое знакомство ........................................................................................................................... 332
Хранение строк в контейнере ......................................................................................... 337
Наследование от контейнеров STL .............................................................................. 339
Классификация итераторов .......................................................................................................... 340
Итераторы в обратимых контейнерах ......................................................................... 342
Категории итераторов ....................................................................................................... 343
Стандартные итераторы ................................................................................................... 345
Основные последовательные контейнеры ............................................................................... 349
Базовые операции в последовательных контейнерах ............................................ 349
Вектор ..................................................................................................................................... 352
дек ............................................................................................................................................ 357
П реобразования контейнеров ........................................................................................ 360
Проверка границ при произвольном доступе ........................................................... 361
Список .................................................................................................................................... 362
Перестановка интервалов ........................................................................... :. ................... 367
М ножество .......................................................................................................................................... 368
Выделение лексем из потока ........................................................................................................ 371
Стек ........................................................................................................................................................ 375
Очередь ................................................................................................................................................. 378
Приоритетная очередь .................................................................................................................... 382
Битовые поля ..................................................................................................................................... 389
Контейнер bitset<n> .......................................................................................................... 390
Контейнер vector<bool> ................................................................................................... 393
Ассоциативные контейнеры ......................................................................................................... 395
Заполнение ассоциативных контейнеров данными ............................................... 399
Отображения ........................................................................................................................ 401
Мультиотображения и дубликаты ключей ................................................................ 403
Мультимножества .............................................................................................................. 405
Объединение контейнеров STL ................................................................................................... 408
Освобождение контейнеров указателей ................................................................................... 411
Создание пользовательских контейнеров ................................................................................ 412
Расширения STL ............................................................................................................................... 414
Другие контейнеры .......................................................................................................................... 416
Итоги ..................................................................................................................................................... 420
Упражнения ........................................................................................................................................ 420