А. Пол ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА C++ Книга Айры Пола, автора многих популярных изданий по С и C++, не является ни учебником по C++, ни курсом по объектно-ориентированному программированию (ООП) «вообще», хотя может быть полезна и в этих двух качествах. Задача книги (точно отраженная в названии) совершенно конкретна: научить читателя писать на C++ объектно-ориентированные программы. Для многих абстрактных идей и понятий ООП в C++ существуют конкретные воплощающие их конструкции. В каждой главе автор вводит и объясняет очередную «порцию» таких конструкций, демонстрирует технику их эффективного использования. В некоторых случаях возникающие перед программистом на C++ проблемы не могут быть непосредственно решены средствами языка. Здесь на помощь приходят разнообразные приемы, не владея которыми трудно программировать на C++ реальные задачи. Такие приемы поясняются автором на многочисленных примерах, причем наиболее показательные программы подвергаются тщательному разбору. Много внимания на страницах книги уделено самым последним дополнениям C++: стандартной библиотеке шаблонов (STL), пространствам имен (namespaces), механизму идентификации типов во время выполнения (RTTI), явным приведениям типов (cast-операторам) и другим. Книга в первую очередь рассчитана на программистов, желающих получить ясное представление о парадигме объектно-ориентированного программирования в C++. Издание также будет полезно преподавателям, студентам и всем, кто хочет освоить объектно-ориентированное программирование на C++. Содержание Предисловие 13 Глава 1 Зачем нужно объектно-ориентированное программирование на C++? 17 1.1. Объектно-ориентированное программирование 18 1.2. Пример программы на C++ 19 1.3. Инкапсуляция и расширяемость типов 21 1.4. Конструкторы и деструкторы 23 1.5. Перегрузка 25 1.6. Шаблоны и обобщенное программирование 27 1.7. Стандартная библиотека шаблонов (STL) 29 1.8. Наследование 30 1.9. Полиморфизм 32 1.10. Исключения в C++ 34 1.11. Преимущества объектно-ориентированного программирования 35 Глава 2 Собственные типы данных и инструкции 37 2.1. Элементы программы 37 2.1.1. Комментарии 38 2.1.2. Ключевые слова 38
2.1.3. Идентификаторы 2.1.4. Литералы 2.1.5. Операторы и знаки пунктуации 2.2. Ввод-вывод 2.3. Структура программы 2.4. Простые типы 2.4.1. Инициализация 2.5. Традиционные преобразования 2.6. Перечислимые типы 2.7. Выражения 2.8. Инструкции 2.8.1. Присваивание и выражения 2.8.2. Составная инструкция 2.8.3. Инструкции if и if-else 2.8.4. Инструкция while 2.8.5. Инструкция for 2.8.6. Инструкция do 2.8.7. Инструкции break и continue 2.8.8. Инструкция switch 2.8.9. Инструкция goto 2.9. Практические замечания Резюме Упражнения Глава 3 Функции и указатели 3.1. Функции 3.1.1. Вызов функции 3.2. Определение функции 3.3. Инструкция return 3.4. Прототипы функций 3.5. Аргументы по умолчанию 3.6. Перегрузка функций 3.7. Встраивание 3.8. Область видимости и класс памяти 3.8.1. Класс памяти auto 3.8.2. Класс памяти register 3.8.3. Класс памяти extern 3.8.4. Класс памяти static 3.8.5. Таинства компоновки 3.9. Пространства имен 3.10. Типы указателей 3.10.1. Определение адреса и разыменование 3.10.2. Вызов по ссылке на основе указателей 3.11. Применение void
39 39 41 41 42 44 45 46 49 50 53 53 55 55 56 56 57 58 59 60 61 61 63 69 69 69 70 71 72 74 75 76 77 78 79 79 81 82 82 83 84 84 86
3.12. Массивы и указатели 3.12.1. Индексирование 3.12.2. Инициализация 3.13. Связь между массивами и указателями 3.14. Передача массивов функциям 3.15. Объявления ссылок и вызов по ссылке 3.16. Проверка утверждений и корректность программы 3.17. Строки: соглашение о char* 3.18. Многомерные массивы 3.19. Операторы свободной памяти new и delete 3.20. Практические замечания 3.20.1. void* и reinterpret_cast 3.20.2. Замена объявлений static extern Резюме Упражнения Глава 4 Реализация АТД в базовом языке 4.1. Агрегатный тип struct 4.2. Оператор указателя структуры 4.3. Пример: стек 4.4. Объединения 4.5. Комплексные числа 4.6. Пример: флеш 4.7. Битовые поля 4.8. Пример: двумерные динамические массивы 4.9. Практические замечания Резюме Упражнения Глава 5 Сокрытие данных и функции-члены класса 5.1. Функции-члены класса 5.2. Доступ: закрытый и открытый 5.3. Классы 5.4. Область видимости класса 5.4.1. Оператор разрешения области видимости :: 5.4.2. Вложенные классы 5.5. Пример: пересмотрим флеш 5.6. Статические члены данных 5.7. Указатель this 5.8. Функции-члены типа static и const 5.8.1. Изменчивость (mutable) 5.9. Контейнеры и доступ к их содержимому 5.10. Практические замечания Резюме
86 87 88 88 89 90 92 94 95 95 98 98 98 99 100 107 107 109 109 113 115 116 120 121 124 124 125 131 132 135 136 138 138 139 140 142 143 144 146 147 149 150
Упражнения Глава 6 Создание и уничтожение объектов 6.1. Классы с конструкторами 6.1.1. Конструктор по умолчанию 6.1.2. Инициализатор конструктора 6.1.3. Конструкторы как преобразования 6.2. Создание динамического стека 6.2.1. Копирующий конструктор 6.3. Классы с деструкторами 6.4. Пример: динамически размещаемые строки 6.5. Класс vect 6.6. Члены данных, являющиеся классами 6.7. Пример: односвязный список 6.8. Двумерные массивы 6.9. Многочлен как связный список 6.10. Строки, использующие семантику ссылок 6.11. В отсутствии конструктора, копирующий конструктор и другие тайны 6.11.1. Деструкторы: некоторые детали 6.12. Практические замечания Резюме Упражнения Глава 7 Ad hoc полиморфизм 7.1. Преобразования АТД 7.2. Перегрузка и выбор функций 7.3. Дружественные функции 7.4. Перегрузка операторов 7.5. Перегрузка унарных операторов 7.6. Перегрузка бинарных операторов 7.7. Перегрузка операторов присваивания и индексирования 7.8. Многочлены: что можно ждать от типа и языка 7.9. Перегруженные операторы ввода-вывода « и » 7.10. Перегрузка оператора () для индексирования 7.11. Операторы указателей 7.11.1. Указатель на член класса 7.12. Перегрузка new и delete 7.13. Практические замечания 7.13.1. Соответствие сигнатуре Резюме Упражнения Глава 8 Перебор: итераторы и контейнеры
151 155 156 157 157 158 159 160 161 162 166 168 169 173 174 179 181 182 182 183 184 191 192 193 195 197 199 201 202 206 207 208 210 212 214 216 217 218 220 227
8.1. Перебор 8.2. Итераторы 8.3. Пример:quicksort() 8.4. Дружественные классы и итераторы 8.5. Обобщенное программирование с использованием void* 8.6. Список и итератор списка 8.7. Практические замечания Резюме Упражнения Глава 9 Шаблоны, обобщенное программирование и STL 9.1. Шаблонный класс stack 9.2. Шаблоны функций 9.2.1. Соответствие сигнатуре и перегрузка 9.3. Шаблоны классов 9.3.1. Друзья 9.3.2. Статические члейы 9.3.3. Аргументы шаблона класса 9.4. Параметризация класса vector 9.5. Параметризация quicksort^) 9.6. Параметризованное дерево двоичного поиска 9.7. STL 9.8. Контейнеры 9.8.1. Последовательные контейнеры 9.8.2. Ассоциативные контейнеры 9.8.3. Адаптеры контейнеров 9.9. Итераторы 9.9.1. Итераторы istream_iterator и ostream_iterator 9.9.2. Адаптеры итераторов 9.10. Алгоритмы 9.10.1. Алгоритмы сортировки 9.10.2. Не изменяющие последовательность алгоритмы 9.10.3. Изменяющие последовательность алгоритмы 9.10.4. Численные алгоритмы 9.11. Функции 9.12. Адаптеры функций 9.13. Практические замечания Резюме Упражнения Глава 10 Наследование 10.1. Производный класс 10.2. Преобразования типов и видимость
227 228 229 232 234 236 239 240 241 245 245 247 249 250 250 250 —— 250 251 254 255 259 260 262 263 265 267 268 269 269 270 270 271 272 273 275 276 276 277 281 282 284
10.3. Повторное использование кода: класс двоичного дерева 10.4. Виртуальные функции 10.5. Абстрактные базовые классы 10.6. Шаблоны и наследование 10.7. Множественное наследование 10.8. Наследование и проектирование 10.8.1. Форма подтипов 10.9. Идентификация типа на этапе выполнения 10.10. Практические замечания Резюме Упражнения Глава 11 Исключения 11.1. Использование assert.h 11.2. Использование signal.h 11.3. Исключения C++ 11.4. Запуск исключений 11.4.1. Перезапуск исключений 11.4.2. Выражения исключений 11.5. Пробные блоки try 11.6. Обработчики 11.7. Спецификация исключения 11.8. terminate() и unexpected() 11.9. Пример кода с исключениями 11.10. Стандартные исключения и их использование 11.11. Практические замечания Резюме Упражнения Глава 12 ООП на C++ 12.1. Требования к языку ООП 12.2. АТД в не-ООП языках 12.3. Клиенты и производители 12.4. Повторное использование кода и наследование 12.5. Полиморфизм 12.6. Сложность языка 12.7. Успех ООП на C++ 12.8. Платонизм: проектирование «tabula rasa» 12.9. Принципы проектирования 12.10. Схемы, диаграммы и инструменты 12.11. Штампы проектирования 12.12. C++: критика Резюме Упражнения
286 289 293 297 299 301 302 304 305 306 307 311 311 312 316 317 318 319 319 320 321 321 322 324 325 326 328 331 331 332 333 334 335 336 337 338 340 341 343 343 345 346
Приложение А Коды символов ASCII Приложение В Приоритет и порядок выполнения операторов Приложение С Руководство по языку С.1. Структура программы С.2. Лексические элементы С.2.1. Комментарии С.2.2. Идентификаторы С.2.3. Ключевые слова С.3. Константы С.4. Объявления и правила области видимости С.5. Пространства имен С.6. Правила компоновки С.7. Типы С.8. Приведения и правила преобразований С.9. Выражения и операторы С.9.1. Выражения sizepf С.9.2. Выражения автоинкремента и автодекремента С.9.3. Арифметические выражения С.9.4. Выражения отношения, равенства и логические выражения С.9.5. Выражения присваивания С.9.6. Выражения с запятой С.9.7. Условные выражения С.9.8. Выражения с битовыми операторами С.9.9. Выражения с определением адреса и обращением по адресу С.9.10. Выражения с new и delete С.9.11. Другие выражения С.10. Инструкции С.10.1. Инструкции-выражения С.10.2. Составная инструкция С.10.3. Инструкции if и if-else С.10.4. Инструкция while С.10.5. Инструкция for С.10.6. Инструкция do С.10.7. Инструкции break и continue С.10.8. Инструкция switch С.10.9. Инструкция goto С.10.10. Инструкция return С.10.11. Инструкция-объявление С.11. Функции С.11.1. Прототипы С.11.2. Вызов по ссылке
349 351 353 353 353 354 354 355 355 357 359 360 362 364 367 367 368 368 368 369 370 370 371 371 372 374 375 376 376 377 377 377 378 379 379 380 381 381 381 382 383
С.11.3. Встроенные функции С.11.4. Аргументы по умолчанию С.11.5. Перегрузка С.11.6. Типобезопасная компоновка для функций С.12. Классы С.12.1. Конструкторы и деструкторы С.12.2. Функции-члены С.12.3. Дружественные функции С.12.4. Указатель this С. 12.5. Перегрузка операторов С.12.6. Функции-члены типа static и const С.12.7. Изменчивость (mutable) С.12.8. Проектирование классов С.13. Наследование С.13.1. Множественное наследование С.13.2. Вызов конструктора С.13.3. Абстрактные базовые классы С.13.4. Указатель на член класса С.13.5. Идентификация типа на этапе выполнения С.13.6. Виртуальные функции С.14. Шаблоны С.14.1. Параметры шаблона С.14.2. Шаблоны функций С.14.3. Друзья С.14.4. Статические члены С.14.5. Специализация С. 15. Исключения С.15.1. Запуск исключений С.15.2. Пробные блоки try С.15.3. Обработчики С.15.4. Спецификация исключения С.15.5. terminate() и unexpected() С.15.6. Стандартные библиотечные исключения С.16. Предосторожности, связанные с совместимостью С.16.1. Объявления вложенных классов С.16.2. Совместимость типов С.16.3. Разное С.17. Новые возможности C++ Приложение D Ввод-вывод D.1. Класс вывода ostream D.2. Форматированный вывод и iomanip.h D.3. Пользовательские типы: вывод D.4. Класс ввода istream
383 383 383 385 385 386 387 387 388 388 390 391 391 391 393 394 394 394 394 395 396 397 398 399 399 400 400 401 402 403 403 404 404 404 405 405 405 406 407 407 408 410 412
D.5. Файлы D.6. Использование строк как потоков D.7. Функции и макро в ctype.h D.8. Использование состояния потока D.9. Совместное использование библиотек ввода-вывода Приложение Е STL и строковые библиотеки Е.1. Контейнеры Е.1.1. Последовательные контейнеры Е.1.2. Ассоциативные контейнеры Е.1.3. Адаптеры контейнеров Е.2. Итераторы Е.2.1. Категории итераторов Е.2.2. Итератор istream_iterator Е.2.3. Итератор ostream_iterator Е.2.4. Адаптеры итераторов Е.3. Алгоритмы Е.3.1. Алгоритмы сортировки Е.3.2. Не изменяющие последовательность алгоритмы Е.3.3. Изменяющие последовательность алгоритмы Е.3.4. Численные алгоритмы Е.4. Функции Е.4.1. Адаптеры функций Е.5. Распределители памяти Е.6. Строковая библиотека Е.6.1. Конструкторы Е.6.2. Функции-члены Е.6.3. Глобальные операторы Литература Предметный указатель Предметный указатель ->* 212, 394 Символы .* 212, 394 , (запятая) 370 /* 38, 354 ! 51, 369 // 20, 38, 354 != 51 : : 358; 375 #define, директива 76, 357 < 51 #include, директива 357 << 207, 407, 408 & 53, 83, 371 <= 51 && 51 - 198 () 53, 198, 208, 374 = = 51 - 53, 84, 86, 371, 374 > 51 ++ 54, 368 >= 51 - 54, 368 >> 208, 407, 412 -> 109, 198, 210, 374
413 415 416 417 419 421 421 423 423 424 426 426 427 427 427 428 428 431 432 434 435 436 437 438 439 440 443 445 447
?: 370 [] 53, 89, 198, 374 ' \0 24, 162, 412 {} 55, 375, 376 | | 51 - 24, 155 A abstract base class 394 abstract class 293 abstract data type 18 accessor function 150 accumulate(), функция 30, 259, 272 Ada 332, 336 adaptor 265, 424 adaptor pattern 393 address operator 83 ALGOL 343, 345 alias 90 allocate(), функция 122 allocator 437 anonymous namespace 83 area(), функция 33 array 86 array_2d, программа 123 ASCII, таблица символов 349 assert, макро 93, 311 assert.h 93, 311 assertion 92, 311 assign(), функция 22, 117 auto класс памяти 78 ключевое слово 363 avg_arr(), функция 75 B bad_alloc исключение 324, 374 класс 325, 404 bad_cast исключение 324 класс 325, 404 bad_typeid, класс 325, 404 begin(), функция 30 bitfield 120 bool, тип 51, 362, 368
break 58, 379 C call-by-reference 84 call-by-value 42, 70 calling environment 69 case 59, 379 CASE-средства 341 cast 47, 364, 385 cast away constness 48, 365 catch 34 ключевое слово 316 обработчик 320 caux 413 cctype 416 cerr 407, 413 ch_stack(), функция 111 char*, тип 94 checks.h 312 cin 412, 413 class, ключевое слово 136, 282, 391 class-responsibility-collaboration 341 client 333 clog 413 CLOS 344 close(), функция 414 COBOL 332, 343 coercion 335 comp(), функция 256 completeness 340 complex 83 complex.h 83, 360 computer assisted software engineering (CASE) 341 const 144 ключевое слово 357, 363, 390 модификатор 82 const-correctness 144 const_cast, приведение 48, 146, 365, 391 constructor 23, 148, 155, 386 initializer 157 container 110 container class 227
continue 59, 379, copy constructor 160 copy(), функция 271 cout 20, 407, 413 cprn 413 CRC-карточки 341 cstddef 268, 427 cstdio 41 cstring 86, 94, 162 cstring.h 86 ctype.h 407, 416 D DAG 299, 393 dec, манипулятор 409 deep copy 161 default 59, 379 default argument 74 deferred method 293 define, макро 247 delete 24, 95, 96, 214, 215, 372 deque 260, 421 dereferencing 84 design pattern 343 destructor 23, 155, 386, difference_type 437 directed acyclic graph 299, 393 do 57, 378 down-cast 304 dymamic array 121 dynamic_cast 48 оператор 304, 394 приведение 365 E Eiffel 344 element_lval(), функция 148 element_rval(), функция 148 empty, операция 110 encapsulation 19 end(), функция 30 endl 20 идентификатор 42 манипулятор 408 entity-relation 342
enum 49 enumerator 49 EOF 418 except.h 321, 404 exception 324 класс 325, 404 explicit, ключевое слово 23, 158, 183, 366 extern, ключевое слово 79, 361, 363 extraction 412 F FILE, ТИП 333 find(), функция 271 find_max(), функция 122, 148 float.h 45 flush, манипулятор 408 for 56, 377 FORTRAN 332, 343, 345 free store 95, 372 free(), функция 214 friend .ключевое слово 25, 195, 387 fstream.h 413 full, операция 110 function overriding 283, 305 prototype 72 библиотека 273, 435 G garbage collection 179, 344 gcd(), функция 101 gen_tree, класс 256, 298 generic pointer 86 get from 412 goto 60, 380 grad_student, класс 31, 283 greater(), функция 92, 193 H handler class 179 HASA, отношение 302, 342 Hello world! 20 hex, манипулятор 409 hierarchy 341 I ICON 340
identifier 39 if 55, 377 if-else 55, 377 inclusion 336 index 87 inheritance 18, 281, 391 init(), функция 29 inline 20, 49, 76, 82, 134, 383 inner_product(), функция 272 insert(), функция 256, 287 insertion 407 interface inheritance 283 invertibility 340 iomanip.h 408, 409 ios, класс 414 iostream 20, 41, 83 iostream.h 20, 41, 83, 233, 301, 360, 407, 408, 419 ISA, отношение 283, 301, 342 istream, класс 412 istream_iterator 268, 427 istringstream 415 K keyword 38 L label 60, 380 last-in-first-out (LIFO) 109, 114, 334 length(), функция 22 LIKEA, отношение 286, 342 limits.h 45 linkage 82 LISP 332 list, класс 236, 260, 421 literal 39 living, класс 293 logic_error, класс 325, 404 lvalue 54, 90, 148 M main(), функция 20 manipulator 20 manufacturer 333 map 260, 421 matrix, класс 173, 210 member function 133
memberwise initialization 161 memcpy(), функция 86, 161, 234 min(), функция 72, 73 mixin class 393 Modula-2 332, 336 Modula-3 336 mpy(), функция 197, 198 multimap 260, 421 multiple inheritance 393 multiset 260, 421 mutable, ключевое слово 146, 391 mutator 150 my_string, класс 22, 23, 164, 232 N namespace 82 anonymous 83 scope 82 std 41, 360 NDEBUG, макро 93, 312 new 24, 95, 214, 372, 373 new.h 215, 374 null pointer constant 169 O object 18 Occam's razor 340, 391 oct, манипулятор 409 open(), функция 414 operator, ключевое слово 25, 41, 192, 197, 388 operator+(), функция 27 operator=(), функция 204 order(), функция 85, 91 orthogonality 340 ostream, класс 407, 408 ostream_iterator 268, 427 ostringstream 415 out_of_range, класс 325, 404 overflow_error, класс 325, 404 overload 193 overloading 25, 75, 383 P partition() 231, 254 Pascal 331, 332, 336 PL/1 332, 343
place_min(), функция 93 placement 214, 374 platonism 338 pointer 437 poker, программа 116, 119, 140 polymorphism 191 pop, операция 110 postcondition 311 precondition 311 prepend(), функция 176 print(), функция 22, 25, 30, 171 printf(), функция 73 priority_queue, контейнерный адаптер 265, 425 privacy 81 private 21, 135 ключевое слово 132, 282, 391 protected 21 ключевое слово 282, 132, 391 public 21, 31 ключевое слово 132, 282, 391 pure virtual function 293 push, операция 110 push_front(), функция 238 put to 407 Q queue, контейнерный адаптер 265, 425 quicksort(), процедура 229, 254 R raise(), функция 312 rand(), функция 118, 141 range_error, класс 325, 404 rational, программа 194 reference 437 reference counting 179 register, ключевое слово 79, 363 reinterpret_cast 48, 98, 365 release(), функция 171 return 20, 71, 381 reverse(), функция 28, 176, 271 ring(), функция 70 RTTI 304, 394 run-time type identification 304, 394
runt ime_error, класс 325, 404 rvalue 148 S salary, программа 145, 390 scope 77, 138 scope resolution 133, 138 self-referential structure 169 set 260, 421 set_new_handler(), функция 374 shallow copy 161 shape, класс 33, 292 short-circuit evaluation 52 showhide, программа 213 signal, программа 314 signal(), функция 313 signal.h 312, 316 signature 76 signature matching algorithm 76 Simula 67 293, 332, 339 size_t, ran 86 size_type 437 sizeof 45, 53, 367 Slist 128, 169, 171 Smalltalk 21, 332, 344 SNOBOL 340 sort(), функция 30, 270 square, класс 34 sstream 415 stack класс 245 контейнерный адаптер 265, 425 statement 53 static 80, 81, 142, 144, 363, 390 static_cast 47, 61, 365 stddef.h 86, 268, 427 stderr 407 stdin 412 stdio.h 41, 73, 333, 407, 419 stdlib.h 161 stdout 407 stepwise refinement 69 STL 29, 259, 421 Stl_vect, программа 262 strcpy(), функция 95
string 440 библиотека 20 string.h 94, 162, 333 strstream, класс 415 strstream.h 415 structure member 107 student, класс 31, 282 subscript 87 swap(), функция 231 switch 59, 60, 379, 380 T tabula rasa, методика 338 tag name 49, 108 template 27 ключевое слово 245, 396 terminate(), функция 321, 404 this, указатель 143, 144, 388 throw выражение 320 ключевое слово 34, 316 token 37, 353 top, операция 110 trivial conversion 217 try 34 type_info, класс 304, 394 type_info.h 304, 395 typedef, ключевое слово 108, 358, 361 type id, оператор 304, 394 typeinfo.h 304, 395 U unexpected(), функция 321, 404 union 113 unsigned int, Тип 86 using, ключевое слово 20, 82, 360 V value_type 437 vect, класс 166, 203 vector 260, 421 класс 228, 251 virtual 289, 292, 395 void 20, 70, 73, 86, 96 ключевое слово 86 тип 20 void* 86, 98, 234, 364
volatile, модификатор 217, 363 W wchar_t, Тип 362 while 56, 377 WYSIWYG 335 X xalloc, исключение 324, 374 A абстрактный базовый класс 33, 293, 394 класс 293 тип данных 18, 107, 131 автодекремент 368 автоинкремент 368 автоматический класс памяти 78 автоматическое преобразование типов 47 агрегат данных 107 агрегатный тип struct 107 адаптер для указателя на функцию 437 итератора 269, 427 контейнерный 265, 424 отрицающий 437 связывающий 275, 437 функции 275, 436 адаптерная схема 393 адаптирование структуры данных 188 алгоритм 269, 428 быстрой сортировки 429 выбора перегруженной функции 193, 384, 399 изменяющий 271, 432 копирования элементов 432 копирования элементов, обратный 433 накопления 434 неизменяющий 270, 431 обращения элементов 432 соответствия сигнатуре 76 сортировки 270, 428 сохраняющей сортировки 429 частичной сортировки 429
численный 272, 434 аргумент по умолчанию 74, 383 шаблона 246, 250 арифметическое выражение 368 ассоциативный контейнер 260, 263, 421, 423 АТД 18, 107, 332 клиент АТД 131 поставщик АТД 131 Б базовый адрес 88 массива 86 базовый класс 30, 281 виртуальный 301 безымянное объединение 113 пространство имен 81, 83, 98 библиотека алгоритмов 269, 428 битовое поле 120 битовый оператор 53, 371 блок 55, 77, 78, 376 try 34, 316, 319, 402 быстрая сортировка 229 В Вассермана-Пирчера диаграмма 342 ввод-вывод 41, 407 поток 413 смешанный 419 вектор 260, 262, 421, 423 виртуальная функция 281, 289, 395 чисто виртуальная 293 виртуальный базовый класс 301 включать как часть, отношение 168 включение 336 вложенный класс 139, 405 внешний класс памяти 79 внешняя переменная 79 возбуждение исключения 312, 401 вставка 407 встраивание 76 встроенная функция 20, 383, 416 выбор перегруженной функции 193 выбор члена структуры 108
вывод форматированный 408 вызов деструктора 156, 161 конструктора 156 по значению 42, 70, 98 по ссылке 84, 85, 98, 383 функции 21, 69 вызывающее окружение 69 выражение 50 throw 320 арифметическое 368 исключения 319 присваивания 369 смешанное 46 вычисление по короткой схеме 52 Г глобальная переменная 79 глобальное имя 77 глубокая копия 161 Д двусторонняя очередь 260, 262, 421, 423 декремент 54 постфиксная форма 54 префиксная форма 54 дерево двоичного поиска 255, 287 деструктор 23, 24, 155, 161, 182, 386 вызов 156, 161 диаграмма Вассермана-Пирчера 342 диапазон значений с плавающей точкой 45 диапазон целых значений 45 динамический массив 121 директивы #define 76, 357 #include 20, 357 дисциплина программирования 331 доступ закрытый 135, 136, 137 к статическим членам данных 143 дружественная функция 195, 250, 387, 399 шаблонного класса 250
дружественный итератор 232 дружественный класс 232 З заголовок функции 70 законченность 340 закрытость 81 закрытый член 135 замещение функции 283, 305 запуск исключения 317, 401 знаки пунктуации 41 И идентификатор 39, 354 cout 20 endl 20, 42 идентификация типа на этапе выполнения 304, 394 иерархичность 341 иерархия 30 иерархия типов 302 извлечение 412 изменчивость 146, 391 изменяющий алгоритм 271, 432 именующее выражение, lvalue 54, 90 имя глобальное 77 структуры 108 теговое 49, 108 индекс 87 индексирование 87 инициализатор 46 конструктора 157 инициализация 45, 82 массива 88 почленная 161 инкапсуляция 19, 21 инкремент 54 постфиксная форма 54 префиксная форма 54 инстанцирование типа 245 инструкция 53, 375 {} 55 break 58, 379 continue 59, 379 do 57, 378
for 56, 377 goto 60, 380 if 55, 377 if-else 55, 377 return 20, 71, 381 switch 58, 59, 60, 379, 380 while 56, 377 ввода 42 вывода 42 множественная 375 составная 55, 376 инструкция-выражение 376 инструкция-объявление 381 интерфейс контейнера STL 421 интерфейс типа 150 интерфейсное наследование 283 исключение 34, 311, 312, 316, 400 возбуждение 401 выражение 319 запуск 317, 401 обработчик 317, 403 перезапуск 318, 402 спецификация 321, 403 стандартное 324, 404 функция terminate() 321, 404 функция unexpected() 321, 404 итератор 228, 267, 422, 426 istream_iterator 268, 427 ostream_iterator 268, 427 ввода 267, 426 вывода 267, 426 двусторонний 267, 426 дружественный 232 произвольного доступа 267, 426 прохода вперед 267, 426 списка 236 К класс 21, 131, 341, 385 bad_alloc 325, 404 bad_cast 325, 404 bad_typeid 325, 404 clock 199 exception 325, 404 gen_tree 256, 298
grad_student 31, 283 ios 414 istream 412 list 236 living 293 logic_error 325, 404 matrix 173, 196, 210 my_string 22, 23, 164, 179, 232 ostream 407, 408 out_of_range 325, 404 overflow_error 325, 404 polynomial 175 range_error 325, 404 runtime_error 325, 404 shape 33, 292 square 34 stack 245 strstream 415 student 31, 282 type_info 304, 394 vect 166, 196, 203 vector 228, 251 абстрактный 293 абстрактный базовый 33, 293, 394 базовый 30, 281 ввода 412 виртуальный базовый 301 вложенный 139, 405 вывода 407 двоичного дерева 286 деструктор 155, 386 дружественный 232 конструктор 155, 386 контейнерный 147, 227 наследование 281, 391 область видимости 138 памяти 78, 363 производный 281, 282 управляющий 179 функция-член 132 шаблон 250 классы памяти auto 78
extern 79 register 79 static 81 клиент АТД 19, 131 класса 333 типа 22 ключевое слово 38, 355 auto 78, 363 catch 34, 316 class 132, 136, 282, 391 const 144, 357, 363, 390 delete 95, 372 enum 49 explicit 23, 158, 183, 366 extern 79, 361, 363 friend 25, 195, 387 inline 20, 49, 76, 82, 134, 383 mutable 146, 391 new 95, 372 operator 25, 192, 197, 388 private 132, 135, 282, 391 protected 132, 282, 391 public 21, 31, 132, 282, 391 register 79, 363, return 71 static 80, 8.1, 142, 144, 363, 390 struct 108, 109 template 27, 245, 396 this 143, 388 throw 34, 316 try 316 typedef 108, 358, 361 union 113 using 20, 82, 360 virtual 289, 292, 395 void 20, 73, 86 volatile 363 доступа 21, 132 коды ASCII 349 комментарий 20, 38, 354 комплексные числа 115 компоновка 82, 360, 385 константа 355 перечислимого типа 49, 357
символьная 40, 356 строковая 356 конструктор 23, 148, 155, 386, 394 вызов 156 инициализатор 157 инициализующий 156 как преобразование 158 копирующий 160, 386 копирующий по умолчанию 181 по умолчанию 157 контейнер 110, 147, 260, 421 ассоциативный 260, 263, 421, 423 последовательный 260, 262, 421, 423 контейнерный адаптер 265, 424 priority_queue 265, 425 queue 265, 425 stack 265, 425 контейнерный класс 27, 227 контроль постоянства 144 концепции ООП 19 копирующий конструктор 160, 164, 386 по умолчанию 181 копия глубокая 161 поверхностная 161 корректность программы 92 Л лезвие Оккамы, принцип 340, 391 лексема 37, 353 литерал 39 символьный 40 строковый 40, 94 логический оператор 52, 368 локальная область видимости 77 М макро 76, 416 assert 93, 311 define 247 NDEBUG 93, 312 манипулятор 20, 42, 408 dec 409
endl 408 flush 408 hex 409 oct 409 массив 83, 86, 88 базовый адрес 86, 88, 95 динамический 121, 167 динамический двумерный 173 индекс 87 индексирование 87 инициализация 88 многомерный 95 одномерный 166 передача функциям 89 превышение границ 88 матрица 121, 173 метка 60, 380 case 59, 379 default 59, 379 метод 21, 291 отложенный 293 пошагового уточнения 69 методология ООП 30, 282, 335 многомерный массив 95 многочлен 174, 206 разбросанный 174 сложение многочленов 175 множественное наследование 299, 302, 393 множество 260, 421, 423 модификатор 150, 159 const 82 volatile 217 мультимножество 260, 421, 423 мультиотображение 260, 421, 423 Н наследование 18, 30, 281, 297, 301, 334, 335, 391 интерфейсное 283 множественное 299, 302, 393 одиночное 302 порядок выполнения конструкторов 301 реализации 286 неизменяющий алгоритм 270, 431
непрямое обращение 84 О область видимости 77, 81 глобальная 358 класса 138, 358 локальная 77 пространства имен 82, 358 прототипа функции 358 файла 77, 358 функции 358 обобщенное программирование 234 обобщенный указатель 86, 364 обозримость 81 обработка исключений 34, 316, 317 сигнала 313 обработчик 320, 403 установка 313 обратимость 340 объединение 113 безымянное 113 объект 18, 23, 155 объект-функция 273, 274, 435 объектно-ориентированное программирование 17, 18, 331, 337 концепции 19 преимущества 35 объектно-ориентированное проектирование 282, 335 методология 30 объявление 357, 358 переменной 45 ссылки 90 одиночное наследование 302 Оккамы принцип 340, 391 оператор 41, 351, 367 , (запятая) 54, 370 ! 369 & 53, 83, 371 () 53, 198, 208, 374 - 53, 84, 371 + + 54 - 54 -> 109, 198, 210
->* 212, 394 . (выбора члена) 23, 108 .* 212, 394 : : 358 ; (точка с запятой) 54 << 207, 407, 408 - 198 >> 208, 407, 412 ?: 52 [] 53, 198, 374 delete 24, 95, 96, 215, 372 dynarpic_cast 304, 394 new 24, 95, 372 sizeof 45, 53, 367 switch 114 typeid 304, 394 автодекремента 368 автоинкремента 368 битовый 53, 371 вставка 407 выбора члена структуры 108 вызова функции 53, 208, 374 декремента 54 доступа к члену структуры 23 завершение инструкции 54 индекисрования 374 индексация массива 53 инкремента 54 логические 51, 52, 368 обращения по адресу 53, 371 определения адреса 53, 83, 371 отношения 368 отрицания 369 перегруженный 198 получить из 412 поместить в 407 порядок выполнения 367 приоритет выполнения 367 равенства 51, 368 разрешения области видимости 133, 134, 138, 358, 374 разыменования 53, 84 сравнения 51 указателя на член 374
указателя структуры 109, 210 условные 52, 370 определение 357 функции 70 организация программы 43, 353 ориентированный ациклический граф (DAG) 299, 393 ортогональность 340 ответственность 341 отложенный метод 293 отмена постоянства 48, 146, 365, 391 отношение «включать как часть» 168 отображение 260, 421, 423 отрицающий адаптер 437 очередь 266, 425 двусторонняя 260, 421 П параметр вызываемый по значению 70 формальный 70 шаблона 397 шаблона класса 276 шаблона функции 276 параметризация 251, 254 параметрический полиморфизм 27, 245, 336 первым вошел, последним вышел (ПРО) 109 перебор 227 перегруженная функция 193 алгоритм выбора 250, 399 перегруженный оператор 198 перегрузка 25, 335 функции 75, 193, 383 перегрузка оператора 198, 388 () 208 -> 211 << 207 >> 208 delete 214 new 214 бинарного 201 индексирования 202 присваивания 202
указателя структуры 211 унарного 199 перезапуск исключения 318, 402 переменная внешняя 79 глобальная 79 объявление 45 сокрытие имени 77 перехватчик catch 402 перечисление 357 перечислимая константа 49, 357, 361 перечислимый тип 49 платонизм, философия проектирования 338, 346 поверхностная копия 161 поверхностное копирование 181 повторное использование кода 286, 334, 343 повышение типа 47, 193, 385 подавленное приведение 304 подсчет ссылок 179 подтип 284, 302, 336 поиск строк 442 полиморфизм 32, 191, 335, 336 параметрический 245, 336 чистый 281, 289 полиморфная функция 32 полином 174 получить из 412 поместить в 407 понижение типа 47 порядок выполнения конструкторов 301 последовательный контейнер 260, 262, 421, 423 поставщик АТД 131 постоянная нулевого указателя 169 постусловие 92, 311 поток ввода-вывода 413 состояние 417 почленная инициализация 161 пошаговое уточнение 69 превышение границ массива 88
предусловие 92, 311 преобразование 364 преобразование типа 46, 47, 191, 284 автоматическое 47 АТД 192 неявное 192 от void* 98 тривиальное 217 явное 192 препроцессор 77 приведение 364, 365 подавленное 304 принудительное 335 приведение типов 47, 385 cast 47 const_cast 48 dynamic_cast 48 reinterpret__cast 48, 98 static_cast 47, 61 отмена постоянства 48 принудительное приведение 335 принцип черного ящика 333 принципы проектирования 340 приоритет и порядок выполнения операторов 367 приоритетная очередь 425 присваивание 53, 369, 376 пробный блок 316, 319, 401 проверка утверждения 92, 311 программа 19, 20, 42, 43, 353 корректность 92 элемент 37, 353 программирования дисциплина 331 программы 216 acc_mod.cpp 305 аdd3.срр 73 array.срр 397 array_2d.cpp 122 array_tm.cpp 251 avg_arr.cpp 75 bad_cast.cpp 324 basic_i.cpp 412 basic_o.cpp 408 bell.cpp 70
bellmult.cpp 71 c_pair.cpp 143 call_ref.cpp 84 catch.cpp 320, 403 ch_stacl.cpp 112 ch_stacl.h 110 ch_stac4.cpp 160, 161 ch_stac4.h 159, 161 ch_stac2.h 132 ch_stac3.cpp 136 ch_stac3.h 135 cir_main.cpp 80 circle3.cpp 80 clock.cpp 199, 201, 218 coerce.cpp 251 complexl.cpp 115 complex2.cpp 137 complexc.cpp 388 copy1.cpp 248 copy2.cpp 248 count.с 64 dbl_sp.cpp 414 def_args.cpp 74 dinner.cpp 21 do_test.cpp 58 dynarray.cpp 96 enum_tst.cpp 50 except.cpp 324 for_test.cpp 57, 58, 59 forloop.cpp 378 gcd.cpp 43 genstack.h 235 gentreel.cpp 256, 258 gentree2.cpp 288 gentree2.h 287 goto_tst.cpp 60 greater.cpp 92 hello.cpp 19 how_many.cpp 138 if_test.cpp 55 inline_t.cpp 76, 77 io.cpp 42 list2.h 236, 237, 238, 239, 240 m_to_k.cpp 48
manip.cpp 409 matrix1.cpp 173 matrix2.cpp 196 matrix3.cpp 208 memcopy.cpp 234 min_dbl.cpp 72 min_int.cpp 72 mix_io.cpp 419 modulo.cpp 156 month.cpp 236 mutable.cpp 146 namespacicpp 83 nested .cpp 139 order.cpp 91, 93 over_new.cpp 215 pairvect.cpp 168 poker.cpp 116 poker1.cpp 107 poker2.cpp 140 poly1.cpp 174 poly2.cpp 206 pr_card.cpp 410 pr_card2.cpp 411 predator.cpp 293 printabl.cpp 158 quiksort.cpp 254 rational.cpp 193, 208 salary.cpp 145, 390 scope_t.cpp 77, 78 scope 1.cpp 359 set.cpp 121 shape 1.cpp 33 shape2.cpp 292 showhide.cpp 212 signal.cpp 313 slist.cpp 169, 170, 172 srl_list.cpp 29 stack_t1.cpp 246, 396 stack_t2.cpp 298 stack_t3.cpp 299 stackex.cpp 34 stat_tst.cpp 81 stcast.cpp 365 stl_adap.cpp 275
stl_age.cpp 264 stl_cont.cpp 259 stl_deq.cpp 260 stl_find.cpp 271 stl_func.cpp 274 stl_iadp.cpp 269 stl_io.cpp 268 stl_numr.cpp 273 stl_revr.cpp 271 stl_sort.cpp 270 stl_stak.cpp 266 stl_vect.cpp 262 str_func.cpp 94 str_strm.cpp 416 string 1.cpp 22 string2.cpp 23 string3.cpp 25 string4.cpp 26 string5.cpp 162, 165 string6.cpp 179 string7.cpp 192, 206 string8.cpp 234 string8.h 232, 233 stringt.cpp 438 studentl.cpp 30 student2.cpp 285 student2.h 282-285 sum_arrl.cpp 87 sum_arr2.cpp 89 sum_arr3.cpp 90 swap.cpp 249, 398 switch_t.cpp 59 throw_it.cpp 401 throw l.cpp 317 throw2.cpp 318 tracking.cpp 181 triple.cpp 211 tstack.cpp 27 twod.cpp 147 typeid.cpp 304 union.cpp 113 vect_bnd.cpp 392 vect_ex2.cpp 400 vect_it.cpp 253
vect_it.h 251 vect_ovl.cpp 389 vect1.h 166 vect2.h 203 vect3.h 315, 385 vect4.cpp 322 vect4.h 316, 322 vectacum.cpp 229 vector.h 228, 229 vectsort.cpp 230 virt_err.cpp 291 virt_sel.cpp 290 weekend.cpp 113 while_t.cpp 56 word_cnt.cpp 418 проектирование 301, 340 штамп 343 производитель АТД 131 класса 333 производный класс 281, 282, 283 простой тип 37, 44 пространство имен 20, 41, 82, 359, 360 namespace std 360 безымянное 81, 83, 98 прототип функции 72, 382 список объявлений аргументов 73 псевдоним 90 пунктуация 41 Р разбросанный многочлен 174 размещение 214, 374 разрешение области видимости 133, 138 разыменование указателя 86, 371 раскрытие макро 76 распределитель памяти 437 расширение типа 47 расширяемость типов 21, 37 регистровый класс памяти 79 С сборка мусора 179, 344
свободная память 95, 372 связывающий адаптер 275, 437 сигнал 313 сигнатура функции 32, 76, 384 символ конца строки, \0 24 символьная константа 40, 356 символьный литерал 40 сложение многочленов 175 методом сортировки со слиянием 177 смесь 302 смешанное выражение 46 совместимость с языком С 404 типов 405 сокрытие данных 132, 136 имени переменной 77 сообщение 21, 291 сортировка, быстрая 229 составная инструкция 55, 376 состояние потока 417 сотрудничество 341 специализация шаблона 400 спецификация исключения 321, 403 списки 30, 47, 282, 320, 335, 364, 402 STL: адаптеры итераторов 427 адаптеры функций 275, 437 алгоритм выбора перегруженной функции 193, 250, 384, 399 виды объектов-функций 274, 435 вызов по ссылке с использованием указателей 85 интерфейсы типичных контейнеров STL 260, 421 использование копирующего конструктора 164, 386 использование функций в C++ 305 как работает инструкция switch 60, 380 категории библиотеки
алгоритмов STL 269, 428 концепции ООП 19 некоторые функции из библиотеки cstring 94 операции над списком 169 организация программы на C++ 43, 353 порядок выполнения конструкторов 301, 394 преимущества использования производных классов 283 различия в типах по сравнению с ANSI С 405 типы полиморфизма 335 характеристики языка ООП 331 черный ящик в понимании клиента 334 черный ящик в понимании производителя 334 штампы проектирования в этой книге 343 элементы штампа проектирования 343 список 236, 260, 262, 421, 423 сравнение строк 441 ссылка объявление 90 подсчет 179 стандартная библиотека шаблонов 29, 259, 421 стандартное исключение 324, 404 стандартные файлы 413 стандартный выходной поток 407 статический класс памяти 81 член 250, 399 член данных 142 стек 79, 109, 110, 265, 425 LIFO 109 степень многочлена 174 Страуструп, Бьерн 17, 337 строгое соответствие 193 строка 439, 440 как поток 415
поиск строк 442 сравнение строк 441 строковая библиотека 438 константа 356 строковый литерал 40 тип 333 структура 21, 107 ch_stack 133, 136 listelem 237 slist 128 имя 108 оператор выбора члена 108 оператор указателя 109 программы 42 ссылающаяся на себя 169 член структуры 107 сужение типа 47 сущность-связь, модель 342 счетчик ссылок 179 Т таблицы 349, 368, 369, 371, 431, 432, 433, 434 STL: адаптеры функций 437 STL: арифметические объекты 436 STL: библиотечные функции, связанные с сортировкой 430 STL: библиотечные численные функции 435 STL: логические объекты 436 STL: сравнивающие объекты 436 STL: функции адаптированного стека 266, 425 STL: функции адаптированной очереди 266, 425 STL: функции приоритетной очереди 425 STL: функции-члены вставки и удаления 265, 424 STL: функции-члены распределителей
памяти 437, 438 typedef 358 автоинкремент и автодекремент 368 арифметические выражения 368 ассоциативные конструкторы STL 264, 424 битовый оператор 53, 371 выражения sizeof 367 выражения присваивания 370 глобальные операторы, перегруженные в string 443 закрытые члены данных класса string 439 использование ключевого слова const 357 классы памяти 363 ключевые слова 38, 355 конструкторы класса string 439 манипуляторы ввода-вывода 409 объекты-функции STL 274 объявления 47 объявления и инициализации 220 объявления и присваивания 109 объявления массивов 95 оператор delete 373 оператор new 372 операторы контейнера STL 423 определения ассоциативных контейнеров STL 264, 423 определения контейнеров STL 261, 422 основные инструкции C++ 375 открытые функции-члены string 441 перечислимые константы 357 поисковые функции-члены string 442 преобразующая функция Bctype.h 417 приведения 366 пример строковой константы
356 примеры идентификаторов 354 примеры констант 355 примеры констант с плавающей точкой 356 приоритет и порядок выполнения операторов 367 символьные константы 40, 356 сложность языка 336 стандартные файлы 413 суммирование элементов массива 90 типы 363 тривиальные преобразования 217 файловые режимы 414 фундаментальные типы данных 44, 362 функции 381 функции и макро в ctype.h 416 функции состояния потока 417 функции-члены STL 424 характеристики функций 396 члены string, перегружающие операторы 440 члены контейнера STL 261, 422 члены последовательных контейнеров STL 263, 423 теговое имя 49, 108 тип bool 362, 368 char* 94 FILE 333 size_t 86 string 440 struct 107 unsigned int 86 void 20, 70 wchar_t 362 автоматическое преобразование 47 возвращаемый функцией 70 идентификация на этапе
выполнения 304, 394 инстанцирование 245 интерфейс 150 перечислимый 49 повышение 47, 193, 385 понижение 47 преобразование 46, 47, 191 преобразование АТД 192 приведение 47 простой 37, 44 расширение 47 расширяемость 21, 37 строковый 333, 438 сужение 47 файловый 333 фундаментальный 44, 362 тривиальное преобразование типа 217 тройной условный оператор 52 У указатель 83, 88, 371 this 143, 144, 388, 405 на член класса 212, 394 обобщенный 86, 364 разыменование 84 управляющий класс 179 условный оператор ? : 52, 370 установка обработчика 313 утверждение 92, 311 постусловие 92, 311 предусловие 92, 311 Ф файл, область видимости 77 файловый тип 333 формальный параметр 70 форматированный вывод 408 фундаментальный тип 44, 362 функции accumulate() 30, 259, 272 allocate() 122 area() 33 assign() 22, 117 avg_arr() 75 begin() 30
ch_stack() 111 close() 414 comp() 256 copy() 271 element_lval() 148 element_rval() 148 end() 30 find() 271 find_max() 122, 148 free() 214 gcd() 43, 101 greater (} 92, 193 init() 29 inner_product() 272 insert() 256, 287 length() 22 main() 20, 69 memcpy ( ) 86, 161, 234 min() 72, 73 mpy() 197, 198 open() 414 operator+() 27 operator=() 204 order() 85, 91 partition() 231, 254 place_min() 93 pr_message() 20 prepend() 176 print() 22, 25, 30, 171 printf() 73 push_front (} 238 quicksort() 254 raise() 312 rand() 118, 141 release() 171 reverse() 28, 176, 271 ring() 70 set_new_handler() 374 signal() 313 sort() 30, 270 strcpy() 95 swap() 231 terminate() 321, 404 unexpected() 321, 404
функция 69, 305, 381 аргумент по уполчанию 74 виртуальная 281, 289, 395 возвращаемый тип 70 встроенная 20, 383 вызов 21, 69 вызов по значению 70 вызов по ссылке 383 вызывающее окружение 69 доступа 150, 159 дружественная 195, 387, 399 дружественная, шаблонного класса 250 заголовок 70 замещение '283, 305 определение 70 перегруженная 193 перегруженная, алгоритм выбора 250, 399 перегрузка 75, 383 передача массива функции 89 полиморфная 32 преобразования типа 192 прототип 72, 382 с пустым списком параметров 73 сигнатура 32, 76, 384 чисто виртуальная 293
функция-модификатор 150, 159 функция-член 21, 132, 133, 134, 387 неявно встраиваемая 133 типа const 144 типа static 144 Ч черный ящик 333, 334 численный алгоритм 272, 434 чисто виртуальная функция 293 чистый полиморфизм 281, 289 член закрытый 135 объединения 113 структуры 107 член данных статический 142 Ш шаблон 27, 297, 396 аргумент 246, 250 класса 250 параметр 397 специализация 400 функции 398 ширина битового поля 120 штамп проектирования 343 Э элемент программы 37 Я ядро языка 37