C++: Библиотека программиста

Page 1

Дж.Элджер C++: БИБЛИОТЕКА ПРОГРАММИСТА СПб: Питер, 2000. - 320 с.: ил.

Искусство программирования на C++ отнюдь не сводится к знанию синтаксиса языка. Хорошая программа доставляет эстетическое удовольствие - она проста и изящна одновременно. Однако переход от среднего, «ремесленного» уровня владения C++ к высотам мастерства практически не освещается в литературе. Большинство программистов действует методом проб и ошибок, самостоятельно находя давно придуманные решения. Автор, программист с 20-летним стажем, пытается заполнить этот досадный пробел. Он описывает множество полезных приемов, условно разделенных на три большие темы: нетривиальное использование указателей, иерархии классов и управление памятью. Досконально разобраны и другие полезные темы, в числе которых - создание шаблонов, обработка исключений и оптимизация программ. В книге рассматривается эталонный C++ стандарта ANSI, не связанный ни с каким конкретным компилятором или визуальной средой. Книга ориентирована на программистов, обладающих опытом программирования на C++. Содержание Благодарности Извинения. или вроде того Часть 1. Введение и краткий обзор Глава 1. Зачем нужна еще одна книга о C++? Дао C++ Три великие идеи C++ Как читать эту книгу , Несколько слов о стиле программирования Глава 2. Синтаксис C++ Переменные и константы const Стековые и динамические объекты Области действия и функции Области действия Перегрузка Видимость Типы и операторы Конструкторы Деструкторы Присваивание Перегрузка операторов Глава 3. Шаблоны и безопасность типов Что такое шаблоны и зачем они нужны? Проблемы

13 14 15 17 18 20 22 23 25 25 25 29 33 33 37 38 42 43 52 53 59 69 69 70


Обходные решения Шаблоны - усовершенствованные макросы Синтаксис шаблонов Параметризованные типы Параметризованные функции Параметризованные функции классов Передача параметра Шаблоны с несколькими параметрами Долой вложенные параметризованные типы! Наследование Комбинации простых и параметризованных типов Небезопасные типы в открытых базовых классах Небезопасные типы в закрытых базовых классах Небезопасные типы в переменных класса Глава 4. Исключения Обработка исключений в стандарте ANSI Синтаксис инициирования исключений Синтаксис перехвата исключений Конструкторы и деструкторы Нестандартная обработка исключений Условные обозначения Часть 2. Косвенные обращения Глава 5. Умные указатели Глупые указатели Умные указатели как идиома Оператор -> Параметризованные умные указатели Иерархия умных указателей Арифметические операции с указателями Во что обходится умный указатель? Применения Разыменование значения NULL Отладка и трассировка Кэширование Глава 6. Ведущие указатели и дескрипторы Семантика ведущих указателей Конструирование Уничтожение Копирование Присваивание Прототип шаблона ведущего указателя Дескрипторы в C++ Что же получается?

70 71 71 71 72 73 74 74 74 75 75 75 76 77 79 79 80 83 85 87 87 89 91 91 93 93 94 95 96 97 98 98 100 102 105 105 106 108 108 109 110 111 112


Подсчет объектов Указатели только для чтения Указатели для чтения/записи Глава 7. Грани и другие мудрые указатели Интерфейсные указатели Дублирование интерфейса Маскировка указываемого объекта Изменение интерфейса Грани Преобразование указываемого объекта в грань Кристаллы Вариации на тему граней Инкапсуляция указываемого объекта Проверка граней Обеспечение согласованности Грани и ведущие указатели Переходные типы Полиморфные указываемые объекты Выбор типа указываемого объекта во время конструирования Изменение указываемого объекта во время выполнения программы Посредники Функторы Глава 8. Коллекции, курсоры и итераторы Массивы и оператор [] Проверка границ и присваивание Оператор [] с нецелыми аргументами Имитация многомерных массивов , Множественные перегрузки оператора [] Виртуальный оператор [] Курсоры Простой класс разреженного массива Курсоры и разреженные массивы Операторы преобразования и оператор -> Что-то знакомое Итераторы Активные итераторы Пассивные итераторы Что лучше? Убогие, но распространенные варианты Лучшие варианты Итератор абстрактного массива Операторы коллекций Мудрые курсоры и надежность итераторов

112 113 114 115 115 115 117 119 119 121 121 123 126 127 128 130 131 131 132 132 133 134 137 137 138 139 139 140 140 140 141 142 144 145 145 146 147 147 147 149 150 152 153


Частные копии коллекций Внутренние и внешние итераторы Временная пометка Пример Глава 9. Транзакции и гениальные указатели Тернистые пути дизайна Транзакции Отмена Хватит? Образы и указатели Простой указатель образов Стеки образов Образы автоматических объектов Образы указателей Комбинации и вариации Транзакции и отмена Транзакции и блокировки Класс Const Ptr Класс LockPtr Создание и уничтожение объектов Упрощенное создание объектов Отмена Варианты Вложенные блокировки Взаимные блокировки и очереди Многоуровневая отмена Оптимизация объема Несколько прощальных слов Часть 3. Снова о типах Глава 10. Множественная передача Гомоморфные иерархии классов Взаимозаменяемость производных классов Нормальное наследование Инкапсуляция производных классов Множественная передача Двойная передача Гетероморфная двойная передача Передача более высокого порядка Группировка передач и преобразования Это еще не все Глава 11. Производящие функции и объекты классов Производящие функции make-функции

156 158 160 163 169 169 169 170 171 171 171 173 174 177 179 179 180 182 183 185 187 187 188 188 189 190 191 191 193 195 195 196 197 198 199 200 202 203 204 206 207 208 208


Символические классы и перегруженные make-функции Оптимизация с применением производящих функций Локализованное использование производящих функций Уничтожающие функции Снова о двойной передаче: промежуточные базовые классы Нет - конструкторам копий и оператору =! Объекты классов Информация о классе Еще несколько слов об уничтожающих функциях Определение класса по объекту Представители Глава 12. Невидимые указатели Основные концепции Инкапсуляция указателей и указываемых объектов Производящие функции Ссылки на указатели He-ведущие указатели Ведущие указатели Снова о двойной передаче Удвоенная двойная передача Самомодификация и переходимость Множественная двойная передача Применение невидимых указателей Кэширование Распределенные объекты и посредники Нетривиальные распределенные архитектуры Часть 4. Управление памятью Глава 13. Перегрузка операторов управления памятью Перегрузка операторов new и delete Простой список свободной памяти Наследование операторов new и delete Аргументы оператора new Конструирование с разделением фаз Уничтожение с разделением фаз Кто управляет выделением памяти? Глобальное управление Выделение и освобождение памяти в классах Управление памятью под руководством клиента Объекты классов и производящие функции Управление памятью с применением ведущих указателей Перспективы Глава 14. Основы управления памятью Строительные блоки

208 209 210 211 211 212 212 213 215 215 217 219 219 220 221 221 222 224 226 226 229 231 231 231 232 232 233 235 236 236 239 239 240 242 242 243 243 243 244 244 248 249 249


Поблочное освобождение памяти Скрытая информация Списки свободных блоков Подсчет ссылок Базовый класс с подсчетом ссылок Указатели с подсчетом ссылок Ведущие указатели с подсчетом ссылок Дескрипторы с подсчетом ссылок Трудности подсчета ссылок Подсчет ссылок и ведущие указатели Пространства памяти Деление по классам Деление по размеру Деление по способу использования Деление по средствам доступа Пространства стека и кучи Глава 15. Уплотнение памяти Поиск указателей Мама, откуда берутся указатели? Поиск указателей Дескрипторы, повсюду дескрипторы Общее описание архитектуры Ведущие указатели Вариации Оптимизация в особых ситуациях Алгоритм Бейкера Пространства объектов Последовательное копирование Внешние объекты Алгоритм Бейкера: уход и кормление в C++ Уплотнение на месте Базовый класс VoidPtr Пул ведущих указателей Итератор ведущих указателей Алгоритм уплотнения Оптимизация Последовательное уплотнение на месте Перспективы Глава 16. Сборка мусора Доступность Периметр Внутри периметра Анализ экземпляров

250 252 253 255 255 256 257 258 258 259 260 261 261 262 262 262 263 263 264 268 271 272 272 277 278 279 279 282 284 285 288 288 289 290 290 291 292 292 293 293 293 295 295


Перебор графа объектов Сборка мусора по алгоритму Бейкера Шаблон слабого дескриптора Шаблон сильного дескриптора Итераторы ведущих указателей Перебор указателей Оптимизация Внешние объекты Множественные пространства Сборка мусора и уплотнение на месте Нужно ли вызывать деструкторы? Только для профессиональных каскадеров Концепции «матери всех объектов» Организация памяти Поиск периметра Перебор внутри периметра Сборка мусора Последовательная сборка мусора Итоговые перспективы ПРИЛОЖЕНИЕ. Java против C++ Пример 1 Пример 2 Пример 3 Пример 4 Пример 5 Пример 6 Пример 7 Алфавитный указатель адрес, 265 А виртуальный, 267 автоматические объекты, 174 чисто абстрактный, 195 агрессивная блокировка, 189 бит пометки, 306 алгоритм Бейкера, 279, 298, 306 В анализ экземпляров, 270, 300 ведущие указатели анонимные экземпляры, 49, 209 и грани, 130 арифметические операции с и деструктор, 105 указателями, 93 и конструктор копий, 105 'В' и конструкторы, 105 базовые типы и подсчет ссылок, 257 и оператор ->, 64 и присваивание, 106 и операторы преобразования, 63 и управление памятью, 113 общие сведения, 61 невидимые, 224 базовый класс общие сведения, 105, 255 абстрактный, 49

297 298 298 299 300 302 305 305 306 306 307 307 307 308 309 310 311 311 311 313 313 314 314 314 315 315 316


семантика, 105 видимость, 38 виртуальные базовые классы, 267 вложенные структуры, 34 внешние объекты общие сведения, 284 указатели, 294 внутренние объекты, 305 временные значения, 226 встроенные типы общие сведения, 175 Г глупые указатели, 93 гомоморфные иерархии классов, 20, 22, 127, 153, 207, 208, 311 грани графические интерфейсы, 119 делегирование, 125 и базовые классы, 125 и ведущие указатели, 130 и переходные типы, 127 инкапсуляция указываемых объектов, 126 кристаллы, 122 общие сведения, 120 переменные классов, 124 подмножества функций, 123 проверка, 127 разновидности, 123 симметричность, 128 согласованность, 128 сравнение с наследованием, 119 транзитивность, 128 устойчивость, 128 Д дескрипторы общие сведения, 111, 258 подсчет ссылок, 258 сильные, 259 слабые, 259 ссылки на все объекты, 271 деструкторы

глобальных объектов, 52 и шаблоны, 74 невиртуальные, 52 общие сведения, 30, 52 порядок вызова, 52 прямой вызов, 53 доступность аргументы функций класса, 295 базовые классы, 295 общие сведения, 293 переменные класса, 295 периметр, 293 друзья и ведущие указатели, 107 общие сведения, 41 З закрытое наследование, 38 замыкание, 134 И имитация указателя, 310 инициализация сравнение с присваиванием, 55 инициализирующие функции, 108 инкапсулированные производные классы, 198 интерфейсные указатели дублирование интерфейсов, 116 и правила видимости C++, 116 инкапсуляция указываемых объектов, 118 модульность, 120 общие сведения, 116 итераторы void*, пассивные, 148 абстрактные массивы, 150 активные, 146 активные и пассивные, 147 ведущие указатели, 276 внешние, 158 внутренние, 158 внутренние с временной пометкой, 162 временные внутренние, 158


для частных коллекций, 156 и курсоры, 150 мономорфные активные вне области действия, 148 надежность, 154 общие, сведения, 145 ограничение диапазона, 149 пассивные, 147 с нетипизованной функцией Next(), 149 уничтожающие функции, 211 устойчивые внутренние, 159 фильтрующие, 159 К классы-коллекции общие сведения, 21, 137 операторы, 152 с внедренными объектами, 156 указателей, 157 коллекции, индексируемые, 294 компонентная модель объекта (СОМ), 120 консервативная блокировка, 189 константность аргументы функций, 28 в перечислениях, 26 ведущие указатели, 113 и #define, 26 и->, 177 и перегруженные операторы, 61 константные функции классов, 28 общие сведения, 25 указатели, 27 указатели на константу, 27 конструкторы без аргументов, 43, 45, 175 глобальных объектов, 49 закрытые, 48 защищенные, 48 и объединения, 35 и шаблоны, 74 копий, 46, 172, 270 общие сведения, 30

перегруженные, 48 порядок вызова, 45 с аргументами, 43 косвенные обращения, 20, 21 курсоры для разреженных массивов, 142 и оператор ->, 144 и операторы преобразования, 144 и умные указатели, 145 общие сведения, 145 расширенные операции, 154 куча, 31, 86, 262 кэширование, 231 Л Летучий Голландец, 109 Лискова, критерий, 196 М массивы многомерные, 139 присваивание, 138, 142 проверка границ, 138 разреженные, 141 многоуровневая отмена, 190 множественная передача гетероморфная, 202 графические среды, 202 группировка и преобразования, 204 двойная, 231 двойная передача, 200 общие сведения, 199 удвоенная двойная передача, 226 невидимые указатели ведущие, 224 и сборка мусора, 223 копирование, 222 кэширование, 231 не-ведущие, 222 общие сведения, 219 присваивание, 223 самомодификация, 229 ссылки, 220 уничтожение, 224 неустойчивые объекты, 287


нижний уровень, 291 нормальное наследование, 198 О область действия блоки, 36 глобальные пространства имен, 36 классы, 33 общие сведения, 33 объединения, 35 определение, 33 структуры, 35 обработка исключений catch, 83 set_terminate(), 84 set_unexpected(), 82 terminate(), 84 unexpected(), 82 вложенная, 84 и виртуальные функции, 81 и деструкторы, 85 и конструкторы, 86 и сигнатуры функций, 81 и стандарт ANSI, 79 и умные указатели, 99 неизвестные типы, 82 нестандартная, 87 общие сведения, 79 объявление и определение, 80 ограничения, 85 перезапуск, 81 порядок уничтожения, 87 при отсутствии спецификации, 81 образы автоматических объектов, 174 и указатели, 171 стек, 173 объединение, 35 объект класса внешние структуры данных, 217 и иерархия классов, 214 и информация о классе, 213 и переменные класса, 214 и функции класса, 214

коллекция экземпляров, 215 общие сведения, 207 статистика, 215 операторы (), 66, 135 +=, 229 ->, 64, 176, 220 delete, 21, 31, 67, 211, 260, 263 new, 21, 31, 66, 179, 226, 252, 263 виртуальные, 64 неоднозначность, 64 перегрузка внешними функциями, 60 перегрузка функциями класса, 60 порядок поиска, 63 преобразования, 62 функциональная форма, 59 отмена, 170, 179, 183 очередь операций, 286 П перегрузка и аргументы, 37 и константные функции, 37 общие сведения, 37 скрытие, 39 передача по значению, 46 передача по ссылке, 46 переобъявление членов класса, 39 переходные типы конструирование, 132 общие сведения, 131 полиморфные указываемые объекты, 131 перечисления, 26, 33 подставляемые функции, 23 подсчет ссылок базовый класс, 255 декомпозиция, 259 зацикливание, 258 и ведущие указатели, 259 и сильные дескрипторы, 259 и слабые дескрипторы, 259 общие сведения, 224 посредники, 133


представители, 217 присваивание ведущие указатели, 109 для базовых классов, 58 для переменных классов, 57 другие сигнатуры, 58 общие сведения, 46 перегрузка, 55 по умолчанию, 55 производящие функции, 212 синтаксис и семантика, 53 ' сравнение с инициализацией, 55 производящие функции и ведущие указатели, 106 конструктор копий, 212 общие сведения, 207 применение для локализации, 210 применение для оптимизации, 209 присваивание, 212 пространства памяти в алгоритме Бейкера, 279 деление по классам, 261 деление по размеру, 261 деление по способу использования, 262 деление по средствам доступа, 262 и объекты классов, 217 общие сведения, 20, 21, 249, 260, 306 Р-С распределенные объекты, 114, 133, 295 символические классы, 209 система напарников, 253 скрытая информация, 252 скрытая коллекция указателей, 269 создание экземпляров по имени, 213 специализированные пространства памяти, 268 списки инициализации, 44 ссылки на указатели, 138 общие сведения, 31 стек, 30 стиль программирования, 23

структуры, 35 Т транзакции блокировка, 170 вложенная блокировка, 188 общие сведения, 169 умные указатели затраты ресурсов, 97 и курсоры, 145 и оператор ->, 93 и точки прерывания, 100 иерархия, 95 кэширование, 103 общие сведения, 94, 178 отладка, 100 преобразование типов, 93 применения, 98 статистика класса, 101 трассировка, 101 уплотнение на месте, 288 общие сведения, 263 последовательное, 282 Ф Фибоначчи, числа, 253 фиктивное удаление, 250 функторы и функции классов, 136 общие сведения, 134, 294, 297 Ц циклы событий, 285 Ш шаблоны безопасность типов, 72 вложенные, 74 и #deflne, 70 и простые типы, 75 и умные указатели, 94 наследование, 75 общие сведения, 71 параметризованные типы, 71 параметризованные функции, 72 правила использования параметра, 74


синтаксис, 71






















































































































































































































































































































Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.