Обобщенное программирование и стандартная библиотека C++ 19
Задача 1. Вектор: потребление и злоупотребление 20
Вопрос для новичка 20
Вопрос для профессионала 20
Обращение к элементу вектора 20
Увеличение размера вектора 21
Резюме 25
Задача 2. Строчный двор. Часть 1: sprintf 26
Вопрос для новичка 26
Вопрос для профессионала 26
Радости и печали sprintf 27
Задача 3. Строчный двор
Часть 2: стандартные альтернативы 30
Вопрос для профессионала 30
Альтернатива № 1: snprintf 30
Альтернатива №2: std::stringstream 32
Альтернатива №3: std::strstream 33
Альтернатива №4: boost::lexical_cast 35
Резюме 36
Задача 4. Функции-члены стандартной библиотеки 39
Вопрос для новичка 39
Вопрос для профессионала 39
Игры с mem fun 39
Используйте memfun, но не со стандартной библиотекой 40
Использование указателей на функции-члены — но не со стандартной библиотекой 41
Резюме 41
Задача 5. Красота обобщенности
Часть 1: Азы 42
Вопрос для новичка 42
Вопрос для профессионала 42
Задача 6. Красота обобщенности.
Часть 2: Достаточно ли универсальности? 45
Вопрос для профессионала 45
Задача 7. Почему не специализируются шаблоны функций? 50
Вопрос для новичка 50
Вопрос для профессионала 50
Перегрузка и специализация 50
Пример Димова-Абрамса 52
Мораль сей басни такова... 54
Резюме 54
Задача 8. Дружественные шаблоны 56
Вопрос для новичка 56
Вопрос для профессионала 56
Исходная попытка 57
В "темных углах" 57
Причина 1: не всегда работает 58
Причина 2: удивляет программистов 58
Причина 3: удивляет компиляторы 59
Отступление: проблема в пространстве имен 61
Два неверных обходных пути 62
Резюме 63
Задача 9. Ограничения экспорта
Часть 1: основы 64
Вопрос для новичка 64
Вопрос для профессионала 64
Рассказ о двух моделях 64
Пояснение на примере 65
Использование экспорта 66
Проблема первая: открытый исходный текст 68
Проблема вторая: зависимости и время построения 69
Резюме 70
Задача 10. Ограничения экспорта
Часть 2: взаимосвязи, практичность и советы по использованию 71
Вопрос для новичка 71
Вопрос для профессионала 71
Начало: 1988—1996 гг. 72
1996 г. 73
Опыт работы с экспортом 74
До чего доводит экспорт 75
Трудность корректного использования 75
Потенциальные преимущества экспорта 76
Мораль 77
Вопросы и приемы безопасности исключений 79
Задача 11. Попробуй поймай 80
Вопрос для новичка 80
Вопрос для профессионала 80
Резюме 83
Задача 12. Безопасность исключений: стоит ли овчинка выделки? 84
Вопрос для профессионала 84
Гарантии Абрамса 84
Какая именно гарантия нужна 84
Задача 13. Прагматичный взгляд на спецификации исключений 87
Вопрос для новичка 87
Вопрос для профессионала 87
Нарушение спецификации 87
Применение 88
Проблема первая — призраки типов 89
Проблема вторая — (не)понимание 90
Копнем поглубже 91
Резюме 92
Разработка классов, наследование и полиморфизм 95
Задача 14. К порядку! 96
Вопрос для новичка 96
Вопрос для профессионала 96
Резюме 98
Задача 15. Потребление и злоупотребление правами доступа 99
Вопрос для новичка 99
Вопрос для профессионала 99
Преступник № 1: фальсификатор 100
Преступник №2: карманник 100
Преступник №3: мошенник 101
Персона грата №4: адвокат 101
Не нарушай 102
Задача 16. Крепко закрыт? 103
Вопрос для профессионала 103
Доступность 103
Видимость 104
И снова доступность 107
Резюме 108
Задача 17. Инкапсуляция 110
Вопрос для новичка 110
Вопрос для профессионала 110
Место инкапсуляции в объектно-ориентированном программировании 111
Открытые, закрытые или защищенные данные? 112
Преобразование в общем случае 113
Актуальный момент 115
Резюме 117
Задача 18. Виртуальность 118
Вопрос для новичка 118
Вопрос для профессионала 118
Обычный совет о деструкторах базовых классов 118
Виртуальный вопрос №1: открытость или закрытость? 118
Виртуальный вопрос №2: деструкторы базовых классов 122
Резюме 124
Задача 19. Не можешь — научим, не хочешь — заставим! 126
Вопрос для новичка 126
Вопрос для профессионала 126
Неявно генерируемые функции 127
Спецификации исключений неявно определенных функций 127
Неявный конструктор по умолчанию 129
Неявный копирующий конструктор 130
Неявный копирующий оператор присваивания 130
Неявный деструктор 130
Член auto ptr 131
Семейные проблемы 131
Не хочешь — заставим! 133
Резюме 135
Задача 20. Контейнеры в памяти.
Часть 1: уровни управления памятью 138
Вопрос для новичка 138
Вопрос для профессионала 138
Диспетчеры памяти и их стратегии: краткий обзор 138
Выбор стратегии 139
Резюме 141
Задача 21. Контейнеры в памяти.
Часть 2: какие они на самом деле? 142
Вопрос для новичка 142
Вопрос для профессионала 142
Что попросишь, то получишь? 142
Память и стандартные контейнеры: теория 144
Память и стандартные контейнеры: практика 146
Резюме 147
Задача 22. Новый взгляд на new
Часть 1: многоликий оператор new 149
Вопрос для новичка 149
Вопрос для профессионала 149
Размещающий, обычный и не генерирующий исключений оператор new 150
Оператор new, специфичный для класса 151
Сюрприз сокрытия имен 152
Резюме 155
Задача 23. Новый взгляд на new
Часть 2: прагматизм в управлении памятью 156
Вопрос для новичка 156
Вопрос для профессионала 156
Исключения, ошибки и new(nothrow) 156
Теория и практика 158
Что надо проверять 161
Резюме 162
Оптимизация и эффективность 163
Задача 24. Константная оптимизация 164
Вопрос для новичка 164
Вопрос для профессионала 164
const: ненавязчивый сервис 164
Как const может оптимизировать 165
Резюме 167
Задача 25. inline 168
Вопрос для новичка 168
Вопрос для профессионала 168
Краткий обзор 168
Ответ А: во время написания исходного текста 169
Ответ Б: во время компиляции 170
Ответ В: во время компоновки 171
Ответ Г: при инсталляции приложения 172
Ответ Д: в процессе работы 173
Ответ Е: в некоторое другое время 174
Резюме 174
Задача 26. Форматы данных и эффективность
Часть 1: игры в сжатие. 175
Вопрос для новичка 175
Вопрос для профессионала 175
Различные способы представления данных 176
Задача 27. Форматы данных и эффективность.
Часть 2: игры с битами 179
Вопрос для профессионала 179
BitBuffer, убийца битов 179
Попытка №1: использование unsigned char 180
Попытка №2: использование стандартного контейнера упакованных битов 182
Плотная упаковка 183
Резюме 184
Ловушки, ошибки и головоломки 185
Задача 28. Ключевые слова, не являющиеся таковыми 186
Вопрос для новичка 186
Вопрос для профессионала 186
Зачем нужны ключевые слова 186
Ключевые слова C++ 188
Зарезервированные комментарии 189
Резюме 190
Задача 29. Инициализация ли это? 192
Вопрос для новичка 192
Вопрос для профессионала 192
Базовый механизм заполнения 192
Не инициализация 193
Корректное заполнение 194
Резюме 196
Задача 30. Двойная точность — вежливость программистов 197
Вопрос для новичка 197
Вопрос для профессионала 197
Два слова о float и double 197
Колесо времени 197
О суживающем преобразовании типов 198
Резюме 198
Задача 31. Сумеречное состояние... кода 200
Вопрос для профессионала 200
Мотивация 201
Макросам наплевать... 201
Резюме 203
Задача 32. Небольшие очепятки и прочие курьезы 204
Вопрос для профессионала 204
Задача 33. Ооооператоры 207
Вопрос для новичка 207
Вопрос для профессионала 207
Правило "максимального глотка" 207
Операторные шутки 207
Злоупотребление операторами 208
Дополнительный вопрос 210
Резюме 210
Изучение конкретных примеров 211
Задача 34. Индексные таблицы 212
Вопрос для новичка 212
Вопрос для профессионала 212
Небольшая проповедь о ясности 213
Разбор индексных таблиц 213
Исправление механических ошибок 214
Улучшение стиля 215
Резюме 218
Задача 35. Обобщенные обратные вызовы 221
Вопрос для новичка 221
Вопрос для профессионала 221
Качества обобщенности 221
Разбор обобщенных обратных вызовов 222
Улучшение стиля 222
Исправление механических ошибок и ограничений 224
Резюме 227
Задача 36. Объединения 228
Вопрос для новичка 228
Вопрос для профессионала 228
Основные сведения 229
Построение объединений 231
Разбор кода 232
Эти хитрые имена 236
Использование boost::any 238
Размеченные объединения Александреску 239
Резюме 241
Задача 37. Ослабленная монолитность
Часть 1: взгляд на std::string 242
Вопрос для новичка 242
Вопрос для профессионала 242
Избегайте чрезмерно монолитных конструкций 242
Класс string 243
Резюме 246
Задача 38. Ослабленная монолитность
Часть 2: разбор std::string 247
Вопрос для новичка 247
Вопрос для профессионала 247
Членство — быть или не быть 247
Операции, которые обязаны быть членами 248
Операции, которые следует сделать членами 249
Спорные операции, которые могут не быть ни членами, ни друзьями 249
Задача 39. Ослабленная монолитность
Часть 3: уменьшение std::string 254
Вопрос для новичка 254
Вопрос для профессионала 254
Операции, которые могут не быть членами 254
resize 254
assign и +=/append/push_back 255
insert 256
Небольшой перерыв 256
Задача 40. Ослабленная монолитность
Часть 4: новый std::string 257
Вопрос для новичка 257
Вопрос для профессионала 257
Прочие операции, которые могут не быть членами 257
Небольшой перерыв на кофе 257
replace 258
Второй перерыв на кофе: сору и substr 260
compare 262
find 262
Резюме 263
Список технической литературы 265
Предметный указатель 268
Добавить комментарий