C++: практический подход к решению проблем программирования + CD

Мэтью Уилсон

Пролог
Введение: философия неидеального практика
Дефекты, ограничения, определения и рекомендации
Часть 1. Базовые концепции
Глава 1. Принудительное проектирование: ограничения, соглашения и утверждения
1.1. "Яичница с ветчиной"
1.2. Соглашения времени компиляции: ограничения
1.3. Соглашения времени выполнения: предусловия, постусловия и инварианты
1.4. Утверждения
Глава 2. Проблемы жизненного цикла объекта
2.1. Жизненный цикл объекта
2.2. Контроль ваших клиентов
2.3. Списки инициализации членов и их достоинства
Глава 3. Инкапсуляция ресурсов
3.1. Таксономия инкапсуляции ресурсов
3.2. Типы POD
3.3. Прокси-оболочки
3.4. Типы RRID
3.5. Типы RAII
3.6. RAII: заключение
Глава 4. Инкапсуляция данных и типы значений
4.1. Таксономия инкапсуляции данных
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. Совместно используемые объекты
Глава 6. Классы, контролирующие диапазон действия ресурсов
6.1. Значение
6.2. Состояние
6.3. Программные интерфейсы и службы
6.4. Специальные возможности языка
Часть 2. Выживание в условиях реального мира
Глава 7. Двоичный интерфейс приложения
7.1. Совместно используемый программный код
7.2. Требования для двоичного интерфейса языка С
7.3. Требования С++ для двоичного интерфейса приложения
7.4. Теперь мне ничто не мешает программировать в стиле С
Глава 8. Переносимые через границы
8.1. Как сделать таблицы vtable максимально переносимыми?
8.2. Переносимые таблицы vtable
8.3. Двоичный интерфейс и объекты, переносимые через границы: заключение
Глава 9. Динамические библиотеки
9.1. Явный вызов функций
9.2. Идентичность объектов: единицы компоновки и пространство компоновки
9.3. Продолжительность жизни
9.4. Контроль версий
9.5. Владение ресурсами
9.6. Динамические библиотеки: заключение
Глава 10. Поточная организация вычислений
10.1. Синхронизация доступа к целым числам
10.2. Синхронизация доступа к блокам кода: критические области
10.3. Эффективность неделимых целочисленных операций
10.4. Многопоточные расширения
10.5. Специальная память потока
Глава 11. Статические объекты
11.1. Нелокальные статические объекты: глобальные объекты
11.2. Синглетоны
11.3. Функционально-локальные статические объекты
11.4. Статические члены
11.5. Статические объекты: заключение
Глава 12. Оптимизация
12.1. Встроенные функции
12.2. Оптимизация возвращаемых значений
12.3. Оптимизация пустой базы
12.4. Оптимизация пустых производных классов
12.5. Предотвращение оптимизации
Часть 3 Языковые проблемы
Глава 13. Фундаментальные типы
13.1. Могу ли я получить байт?
13.2. Целые типы фиксированного размера
13.3. Целые типы большого размера
13.4. Опасные типы
Глава 14. Массивы и указатели
14.1. Не повторяйте себя
14.2. Вырождение массивов в указатели
14.3. dimensionof()
14.4. Нельзя передавать массивы функциям
14.5. Массивы всегда передаются с помощью адреса
14.6. Массивы унаследованных типов
14.7. Нельзя иметь многомерные массивы
Глава 15. Значения
15.1. NULL - ключевое слово, которого не было
15.2. Перейдем к ZERO
15.3. Изгибы "истины"
15.4. Литералы
15.5. Константы
Глава 16. Ключевые слова
16.1. interface
16.2. temporary
16.3. owner
16.4. explicit(_cast)
16.5. unique
16.6. final
16.7. Неподдерживаемые ключевые слова
Глава 17. Синтаксис
17.1. Компоновка класса
17.2. Условные выражения
17.3. for
17.4. Обозначение переменных
Глава 18. Имена, вводимые typedef
18.1. Использование typedef для указателей
18.2. Что содержит определение?
18.3. Алиасы
18.4. "Настоящие" typedef
18.5. Хороший, плохой и ужасный
Часть 4. Осознанные преобразования
Глава 19. Приведение типов
19.1. Неявное преобразование
19.3. Пример приведений в стиле С
19.4. "Стероидные" приведения
19.5. explicit_cast
19.6. literal_cast
19.7. union_cast
19.8. comstl::interface_cast
19.9. boost::polymorphic_cast
19.10. Приведение типов: заключение
Глава 20. Прокладки
20.1. Всеохватность изменений и усиливающаяся гибкость
20.2. Прокладки атрибутов
20.3. Логические прокладки
20.4. Управляющие прокладки
20.5. Прокладки преобразований
20.6. Концепции составных прокладок
20.7. Пространства имен и поиск Кенига
20.8. Почему не шаблоны свойств?
20.9. Структурное соответствие
20.10. Разрушение монолита
20.11. Прокладки: заключение
Глава 21. Облицовочные классы
21.1. Облегченный RAII
21.2. Связывание данных и операций
21.3. Уточнение концепций
21.4. Облицовочные классы: заключение
Глава 22. Прикрепляемые классы
22.1. Добавление функциональности
22.2. Выбор оболочки
22.3. Переопределение не виртуальных методов
22.4. Увеличение возможностей
22.5. Моделирование полиморфизма на этапе компиляции: реверсивные прикрепляемые классы
22.6. Параметризованная полиморфная упаковка
22.7. Прикрепляемые классы: заключение
Глава 23. Шаблонные конструкторы
23.1. Скрытые недостатки
23.2. Висячие ссылки
23.3. Специализация шаблонных конструкторов
23.4. Прокси аргументов
23.5. Ориентация аргументов на определенные типы
23.6. Шаблонные конструкторы: заключение
Часть 5. Операторы
Глава 24. operator bool()
24.1. operator int() const
24.2. operator void *() const
24.3. operator bool() const
24.4. operator !() - нет!
24.5. operator boolean const *() const
24.6. operator int boolean::*() const
24.7. Применение операторов в реальных условиях
24.8. operator!
Глава 25. Быстрая, неагрессивная конкатенация строк
25.1. fast_string_concatenator
25.2. Производительность
25.4. Метод посева конкатенации
25.5. Патологическое применение скобок
25.6. Стандартизация
Глава 26. Какой ваш адрес?
26.1. Можно не получить реальный адрес
26.2. Что происходит во время преобразования?
26.3. Что мы возвращаем?
26.4. Какой ваш адрес?: заключение
Глава 27. Операторы индексации
27.1. Операторы преобразования в указатели и операторы индексации
27.2. Обработка ошибок
27.3. Возвращаемое значение
Глава 28. Операторы инкремента
28.1. Недостающие постфиксные операторы
28.2. Эффективность
Глава 29. Арифметические типы
29.1. Определение класса
29.2. Конструирование по умолчанию
29.3. Инициализация (конструирование значения)
29.4. Копирующий конструктор
29.5. Присваивание
29.6. Арифметические операторы
29.7. Операторы сравнения
29.8. Осуществление доступа к значению
29.9. sinteger64
29.10. Усечения, перевод в другие форматы и проверки
29.11. Арифметические типы: заключение
Глава 30. Быстрое вычисление
Часть 6. Расширение C++
Глава 31. Продолжительность жизни возвращаемых значений
31.1. Таксономия "странностей" продолжительности жизни возвращаемых значений
31.2. Зачем возвращать ссылку?
31.3. Решение 1 - integer_to_string
31.4. Решение 2 - специальная память потока
31.5. Решение 3 - расширение RVL
31.6. Решение 4 - определение размера статического массива
31.7. Решение 5 - прокладки преобразований
31.8. Производительность
31.9. RVL: большая победа сборки мусора
31.10. Потенциальные применения
31.11. Продолжительность жизни возвращаемых значений: заключение
Глава 32. Память
32.1. Таксономия памяти
32.2. Лучший из двух миров
32.3. Распределители памяти
32.4. Память: заключение
Глава 33. Многомерные массивы
33.1. Обеспечение синтаксиса индексации
33.2. Установка размеров на этапе выполнения программы
33.3. Установка размеров на этапе компиляции
33.4. Доступ ко всему массиву
33.5. Производительность
33.6. Многомерные массивы: заключение
Глава 34. Функторы и диапазоны
34.1. Синтаксическая неразбериха
34.2. for_all() ?
34.3. Локальные функторы
34.4. Диапазоны
34.5. Функторы и диапазоны: заключение
Глава 35. Свойства
35.1. Расширения компилятора
35.2. Варианты реализации
35.3. Свойства-поля
35.4. Свойства-методы
35.6. Виртуальные свойства
35.7. Применение свойств
35.8. Свойства: заключение
Приложение A. Компиляторы и библиотеки
A.1. Компиляторы
A.2. Библиотеки
A.3. Другие источники
Приложение Б. Остерегайтесь самомнения!
Б.1. Перегрузка операторов
Б.2. Когда-то я пожалел о том, что следовал принципу DRY
Б.3. Параноидальное программирование
Б.4. Настоящее безумие!
Приложение В. Arturius
Приложение Г. Компакт-диск
Эпилог
Библиография
Предметный указатель