Эта книга написана для программистов, уже владеющих языком C++ и желающих поднять свою квалификацию на новый уровень. Давая представление о стиле и идиоматике языка, книга знакомит читателя с теми нетривиальными знаниями, которые опытные программисты C++ получают на личном опыте. Она показывает, что C++ можно использовать и для разработки простых абстракций данных, и для полноценной реализации абстрактных типов данных, и для объектно-ориентированного программирования различных стилей. Кроме того, в ней исследуются идиомы, не поддерживаемые напрямую на базовом уровне C++, например, функциональное и фреймовое программирование, а также расширенные методы "сборки мусора".
Содержание
Предисловие
Изучение языка программирования
О книге
Структура книги
Благодарности
От издателя перевода
Глава 1. Введение
1.1. C++ как развивающийся язык
1.2. Решение проблемы сложности при помощи идиом
1.3. Объекты для 90-х
1.4. Проектирование и язык
Литература
Глава 2. Абстракция и абстрактные типы данных
2.1. Классы
2.2. Объектная инверсия
2.3. Конструкторы и деструкторы
2.4. Подставляемые функции
2.5. Инициализация статических переменных
2.6. Статические функции классов
2.7. Область видимости и константность
2.8. Порядок инициализации глобальных объектов, констант и статических членов классов
2.9. Обеспечение константности функций классов
Логическая и физическая константность
2.10. Указатели на функции классов
2.11. Правила организации программного кода
Упражнения
Литература
Глава 3. Конкретные типы данных
3.1. Ортодоксальная каноническая форма класса
3.2. Видимость и управление доступом
3.3. Перегрузка — переопределение семантики операторов и функций
Пример перегрузки оператора индексирования
Перегрузка операторов в классах и глобальная перегрузка
3.4. Преобразование типа
3.5. Подсчет ссылок
Идиома класса-манипулятора
Экономное решение
Подсчет указателей
Реализация подсчета ссылок в существующих классах
Классы конвертов и синглетные письма
3.6. Операторы new и delete
3.7. Отделение инициализации от создания экземпляра
Упражнения
Литература
Глава 4. Наследование
4.1. Простое наследование
Настройка операций класса Complex для семантики класса Imaginary
Использование кода базового класса в производном классе
Изменение функций производного класса для повышения эффективности
4.2. Видимость и управление доступом
Вертикальное управление доступом при наследовании
Горизонтальное управление доступом при наследовании
Создание экземпляров путем наследования и управления доступом
4.3. Конструкторы и деструкторы
Порядок выполнения конструкторов и деструкторов
Передача параметров конструкторам базовых классов и внутренних объектов
4.4. Преобразование указателей на классы
4.5. Селектор типа
Упражнения
Литература
Глава 5. Объектно-ориентированное программирование
5.1. Идентификация типов на стадии выполнения и виртуальные функции
5.2. Взаимодействие деструкторов и виртуальные деструкторы
5.3. Виртуальные функции и видимость
5.4. Чисто виртуальные функции и абстрактные базовые классы
5.5. Классы конвертов и писем
Классы конвертов и делегированный полиморфизм
Имитация виртуальных конструкторов
Другой подход к виртуальным конструкторам
Делегирование и классы конвертов
Итераторы и курсоры
5.6. Функторы
Функциональное и аппликативное программирование
5.7. Множественное наследование
Пример абстракции окна
Неоднозначность при вызове функций класса
Неоднозначность в данных
Виртуальные базовые классы
Предотвращение лишних вызовов функций виртуальных базовых классов
Виртуальные функции
Преобразование указателей на объекты при множественном наследовании
5.8. Каноническая форма наследования
Упражнения
Пример итератора очереди
Простые классы счетов для банковского приложения
Литература
Глава 6. Объектно-ориентированное проектирование
6.1. Типы и классы
6.2. Основные операции объектно-ориентированного проектирования
6.3. Объектно-ориентированный и доменный анализ
Причины увеличения объема проектирования
Способы расширения абстракций
Балансировка архитектуры
Результаты хорошей балансировки архитектуры
6.4. Отношения между объектами и классами
Отношения “IS-A”
Отношения “HAS-A”
Отношения “USES-A”
Отношения “CREATES-A”
Контекстное изучение отношений между объектами и классами
Графическое представление отношений между объектами и классами
6.5. Субтипы, наследование и перенаправление
Наследование ради наследования — ошибка потери субтипов
Случайное наследование — омонимы в мире типов
Потребность в функциях классов с “истинной” семантикой
Наследование и независимость классов
6.6. Практические рекомендации
Упражнения
Литература
Глава 7. Многократное использование программ и объекты
7.1. Об ограниченности аналогий
7.2. Многократное использование архитектуры
7.3. Четыре механизма многократного использования кода
7.4. Параметризованные типы, или шаблоны
7.5. Закрытое наследование и многократное использование
7.6. Многократное использование памяти
7.7. Многократное использование интерфейса
7.8. Многократное использование, наследование и перенаправление
7.9. Архитектурные альтернативы для многократного использования исходных текстов
7.10. Общие рекомендации относительно многократного использования кода
Упражнения
Литература
Глава 8. Прототипы
8.1. Пример с прототипами класса Employee
8.2. Прототипы и обобщенные конструкторы
8.3. Автономные обобщенные конструкторы
8.4. Абстрактные базовые прототипы
8.5. Идиома фреймовых прототипов
8.6. Условные обозначения
8.7. Прототипы и администрирование программ
Упражнения
Простой анализатор с прототипом
Фреймовые прототипы
Литература
Глава 9. Эмуляция символических языков на C++
9.1. Инкрементное программирование на C++
Инкрементный подход и объектно-ориентированное проектирование
Сокращение затрат на компиляцию
Сокращение затрат на компоновку и загрузку
Ускоренные итерации
9.2. Символическая каноническая форма
Класс Top
Класс Thing
Символическая каноническая форма для классов приложений
9.3. Пример обобщенного класса коллекции
9.4. Код и идиомы поддержки инкрементной загрузки
Загрузка виртуальных функций
Обновление структуры класса и функция cutover
Инкрементная загрузка и автономные обобщенные конструкторы
9.5. Уборка мусора
Пример иерархии геометрических фигур с уборкой мусора
9.6. Инкапсуляция примитивных типов
9.7. Мультиметоды в символической идиоме
Упражнения
Литература
Глава 10. Динамическое множественное наследование
10.1. Пример оконной системы с выбором технологии
10.2. Предостережение
Глава 11. Системные аспекты
11.1. Статическая системная структура
Транзакционные диаграммы
Модули
Подсистемы
Каркасы
Библиотеки
11.2. Динамическая системная структура
Планирование
Контексты
Взаимодействие между пространствами имен
Обработка исключений
Зомби
Литература
Приложение А. C в среде C++
А.1. Вызовы функций
А.2. Параметры функций
А.3. Прототипы функций
А.4. Передача параметров по ссылке
А.5. Переменное количество параметров
А.6. Указатели на функции
А.7. Модификатор const
Пример 1. Использование модификатора const вместо директивы #define
Пример 2. Модификатор const и указатели
Пример 3. Объявление функций с константными аргументами
А.8. Взаимодействие с кодом C
А.8.1. Архитектурные аспекты
А.8.2. Языковая компоновка
А.8.3. Вызов функций C++ из C
А.8.4. Совместное использование заголовочных файлов в C и C++
А.8.5. Импорт форматов данных C в C++
А.8.6. Импорт форматов данных С++ в С
Упражнения
Литература
Приложение Б. Программа Shapes
Приложение В. Ссылочные возвращаемые значения операторов
Приложение Г. Поразрядное копирование
Приложение Д. Иерархия геометрических фигур в символической идиоме
Приложение Е. Блочно-структурное программирование на C++
Книга является руководством для студентов, начинающих изучать среду Borland C++ Builder и языки программирования C/C++. Рассмотрены основные элементы языков C/C++ и примеры создания простейших классов и программ. Изложены принципы визуального проектирования и событийного программирования. На конкретных примерах показаны основные возможности визуальной среды разработки C++ Builder, назначение базовых компонентов и процесс разработки различных типов Windows- и интернет-приложений, в том числе приложений с использованием технологий BDE и MIDAS.
Кросс-платформенный инструментарий разработки ПО Qt от компании Trolltech позволяет создавать приложения С++ промышленных масштабов, которые свободно работают в Windows, Linux/Unix, Mac OS X и Linux для встраиваемых систем без изменения исходного кода.