Предисловие
Что нового во втором издании
Что попало во второй том \r\r Что должен знать читатель
Изучение C++
Цели
Главы
Упражнения
Исходные тексты
Языковые стандарты
Поддержка
Благодарности
От издателя перевода
Глава 1. Знакомство с объектами\r\r Развитие абстрактных представлений
Интерфейс объекта
Скрытая реализация
Повторное использование реализации
Наследование и повторное использование интерфейса
Точное и приблизительное подобие
Взаимозаменяемость объектов и полиморфизм
Создание и уничтожение объектов
Обработка исключений
Анализ и проектирование
Фаза 0 — составление плана\r\r Фаза 1 — что делать \r\r Фаза 2 — как делать\r\r Фаза 3 — построение ядра \r\r Фаза 4 — итеративный перебор сценариев\r\r Фаза 5 — эволюция \r\r О пользе планирования
Экстремальное программирование
Начинайте с написания тестов \r\r Парное программирование
Причины успеха C++
Улучшенный язык C \r\r Быстрое обучение \r\r Эффективность \r\r Простота описания и понимания системы \r\r Максимальная интеграция с библиотеками \r\r Шаблоны и повторное использование исходных текстов \r\r Обработка ошибок \r\r Масштабное программирование
Стратегии перехода
Рекомендации \r\r Организационные трудности
Итоги
Глава 2. Создание и использование объектов\r\r Процесс трансляции
Интерпретаторы \r\r Компиляторы \r\r Процесс компиляции
Средства раздельной компиляции
Объявления и определения \r\r Компоновка \r\r Использование библиотек
Первая программа на C++
Использование классов библиотеки Iostream \r\r Пространства имен \r\r Базовые сведения о строении программы \r\r Программа «Hello, world!» \r\r Запуск компилятора
О потоках ввода-вывода
Конкатенация символьных массивов \r\r Чтение входных данных \r\r Запуск других программ
Знакомство со строками
Чтение и запись файлов
Знакомство с векторами
Итоги
Упражнения
Глава 3. Элементы C в языке C++\r\r Создание функций
Возвращаемое значение функции \r\r Использование библиотеки функций C \r\r Разработка собственных библиотек
Управляющие конструкции
Значения true и false \r\r Цикл if-else \r\r Цикл while \r\r Цикл do-while \r\r Цикл for \r\r Ключевые слова break и continue \r\r Команда switch \r\r Ключевое слово goto\r\r Рекурсия
Знакомство с операторами
Приоритет \r\r Инкремент и декремент
Знакомство с типами данных
Встроенные типы \r\r Ключевые слова bool, true и false \r\r Спецификаторы \r\r Знакомство с указателями \r\r Модификация внешних объектов \r\r Знакомство со ссылками C++ \r\r Указатели и ссылки как модификаторы
Видимость
Определение переменных непосредственно перед использованием
Распределение памяти
Глобальные переменные \r\r Локальные переменные \r\r Статические переменные \r\r Внешние переменные \r\r Константы \r\r Квалификатор volatile
Операторы и их использование
Присваивание \r\r Математические операторы \r\r Операторы отношения \r\r Логические операторы \r\r Поразрядные операторы \r\r Операторы сдвига \r\r Унарные операторы \r\r Тернарный оператор \r\r Оператор запятой \r\r Характерные ошибки при использовании операторов \r\r Операторы приведения типов \r\r Явное приведение типов в C++ \r\r Оператор sizeof \r\r Ключевое слово asm \r\r Синонимы операторов
Создание составных типов
Определение псевдонимов \r\r Объединение переменных в структуры \r\r Перечисляемые типы \r\r Экономия памяти при использовании объединений \r\r Массивы
Рекомендации по отладке
Флаги отладки \r\r Преобразование переменных и выражений в строки \r\r Макрос assert() языка C
Адреса функций
Определение указателя на функцию \r\r Сложные определения и объявления \r\r Использование указателя на функцию \r\r Массивы указателей на функции
Утилита make и управление раздельной компиляцией
Команда make \r\r Make-файлы данной книги \r\r Пример make-файла
Итоги
Упражнения
Глава 4. Абстрактное представление данных\r\r Маленькая библиотека в стиле C
Динамическое распределение памяти \r\r Неверные предположения
Конфликты имен
Базовый объект
Понятие объекта
Абстрактные типы данных
Подробнее об объектах
Этикет использования заголовочных файлов
О важности заголовочных файлов \r\r Проблема многократного объявления \r\r Директивы препроцессора #define, #ifdef и #endif \r\r Стандартное устройство заголовочного файла \r\r Пространства имен в заголовках \r\r Использование заголовков в проектах
Вложенные структуры
Глобальная видимость
Итоги
Упражнения
Глава 5. Скрытие реализации\r\r Установка ограничений
Управление доступом в C++
Защищенные члены
Друзья
Вложенные друзья \r\r Покушение на «чистоту» языка
Строение объекта
Класс
Версия Stash с ограничением доступа \r\r Версия Stack с ограничением доступа
Классы-манипуляторы
Скрытие реализации \r\r Лишние перекомпиляции
Итоги
Упражнения
Глава 6. Инициализация и зачистка\r\r Гарантированная инициализация с помощью конструктора
Гарантированная зачистка с помощью деструктора
Исключение блока определений
Циклы for \r\r Выделение памяти
Класс Stash с конструктором и деструктором
Класс Stack с конструктором и деструктором
Агрегатная инициализация
Конструктор по умолчанию
Итоги
Упражнения
Глава 7. Перегрузка функций и аргументы по умолчанию\r\r Снова об украшении имен
Перегрузка по типу возвращаемого значения \r\r Безопасность типов при компоновке
Пример перегрузки
Объединения
Аргументы по умолчанию
Заполнители в списке аргументов
Выбор между перегрузкой и аргументами по умолчанию
Итоги
Упражнения
Глава 8. Константы \r\r Подстановка значений
Константы в заголовочных файлах \r\r Константы и защита данных \r\r Агрегаты \r\r Отличия от языка C
Указатели
Указатель на константу \r\r Константный указатель \r\r Формат определений \r\r Присваивание и проверка типов \r\r Константность символьных массивов
Аргументы функций и возвращаемые значения
Передача констант по значению \r\r Константное возвращаемое значение \r\r Передача и возвращение адресов
Классы
Ключевое слово const в классах \r\r Константы времени компиляции в классах \r\r Константные объекты и функции классов
Ключевое слово volatile
Итоги
Упражнения
Глава 9. Подставляемые функции\r\r Недостатки препроцессорных макросов
Макросы и доступ
Подставляемые функции
Подставляемые функции внутри классов \r\r Функции доступа \r\r Функции чтения и записи
Классы Stash и Stack с подставляемыми функциями
Подставляемые функции и компилятор
Ограничения \r\r Опережающие ссылки \r\r Скрытые операции в конструкторах и деструкторах
Вынесение определений из класса
Другие возможности препроцессора
Вставка лексем
Средства диагностики
Итоги
Упражнения
Глава 10. Механизм контроля имен \r\r Статические элементы в языке C
Статические переменные в функциях \r\r Статические объекты в функциях \r\r Управление связыванием \r\r Другие определители класса хранения
Пространства имен
Создание пространств имен \r\r Использование пространств имен \r\r Управление пространствами имен
Статические члены в C++
Определение статических переменных классов \r\r Вложенные и локальные классы \r\r Статические функции классов
Порядок инициализации статических объектов
Первое решение \r\r Второе решение
Альтернативные спецификации компоновки
Итоги
Упражнения
Глава 11. Ссылки и копирующий конструктор\r\r Указатели в С++
Ссылки в C++
Ссылки в функциях \r\r Рекомендации по передаче аргументов
Копирующий конструктор
Передача и возврат по значению \r\r Конструирование копий \r\r Копирующий конструктор по умолчанию \r\r Альтернативы
Указатели на члены классов
Функции классов \r\r Пример
Итоги
Упражнения
Глава 12. Перегрузка операторов\r\r Предупреждение
Синтаксис
Перегружаемые операторы
Унарные операторы \r\r Бинарные операторы \r\r Аргументы и возвращаемые значения \r\r Особые операторы \r\r Неперегружаемые операторы
Операторы, не являющиеся членами классов
Базовые рекомендации \r\r Перегрузка присваивания \r\r Поведение функции operator=\r\r Указатели в классах \r\r Подсчет ссылок \r\r Автоматическое создание функции operator=
Автоматическое приведение типа
Приведение типа с использованием конструктора \r\r Оператор приведения типа \r\r Пример приведения типа \r\r Ошибки при автоматическом приведении типа
Итоги
Упражнения
Глава 13. Динамическое создание объектов\r\r Создание объекта
Динамическое выделение памяти в языке C \r\r Оператор new \r\r Оператор delete \r\r Простой пример \r\r Затраты на управление памятью
Переработка ранних примеров
Вызов delete void* как вероятный источник ошибки \r\r Зачистка при наличии указателей \r\r Класс Stash с указателями
Операторы new и delete для массивов
Указатели и массивы
Нехватка памяти
Перегрузка операторов new и delete
Перегрузка глобальных операторов \r\r Перегрузка операторов для класса \r\r Перегрузка операторов для массивов \r\r Вызовы конструктора \r\r Операторы new и delete с дополнительными аргументами
Итоги
Упражнения
Глава 14. Наследование и композиция\r\r Синтаксис композиции
Синтаксис наследования
Список инициализирующих значений конструктора
Инициализация объектов внутри класса \r\r Встроенные типы в списке инициализирующих значений
Объединение композиции с наследованием
Автоматический вызов деструктора \r\r Порядок вызова конструкторов и деструкторов
Скрытие имен
Функции, которые не наследуются автоматически
Наследование и статические функции классов
Выбор между композицией и наследованием
Выделение подтипов
Закрытое наследование
Защищенность
Защищенное наследование \r\r Перегрузка операторов и наследование
Множественное наследование
Пошаговая разработка
Повышающее приведение типа
Понятие повышающего приведения типа \r\r Повышающее приведение типа и копирующий конструктор \r\r Снова о композиции и наследовании \r\r Повышающее приведение типа указателей и ссылок \r\r Проблемы
Итоги
Упражнения
Глава 15. Полиморфизм и виртуальные функции\r\r Эволюция программирования на C++
Повышающее приведение типа
Проблема
Связывание вызовов функций
Виртуальные функции
Расширяемость \r\r Позднее связывание в C++
Хранение информации о типе \r\r Механизм вызова виртуальных функций \r\r Внутренние механизмы \r\r Инициализация указателя VPTR \r\r Повышающее приведение типа и объекты
Виртуальные функции и эффективность
Абстрактные базовые классы и чисто виртуальные функции
Определения чисто виртуальных функций
Наследование и таблицы виртуальных функций
Расщепление объектов
Перегрузка и переопределение
Изменение типа возвращаемого значения
Виртуальные функции и конструкторы
Порядок вызова конструкторов \r\r Поведение виртуальных функций внутри конструкторов
Деструкторы и виртуальные деструкторы
Чисто виртуальные деструкторы \r\r Виртуальные функции в деструкторах \r\r Создание однокоренной иерархии
Перегрузка операторов
Понижающее приведение типа
Итоги
Упражнения
Глава 16. Знакомство с шаблонами\r\r Контейнеры
Потребность в контейнерах
Общие сведения о шаблонах
Многократное использование кода в C и Smalltalk \r\r Решение с применением шаблонов
Синтаксис шаблонов
Определения неподставляемых функций \r\r Класс IntStack в виде шаблона \r\r Константы в шаблонах
Шаблоны для классов Stack и Stash
Шаблон класса PStash для указателей
Управление принадлежностью
Хранение объектов по значению
Знакомство с итераторами
Класс Stack с итераторами \r\r Класс PStash с итераторами \r\r Ценность итераторов
Шаблоны функций
Итоги
Упражнения
Приложение А. Стиль программирования \r\r Общие правила \r\r Имена файлов \r\r Начальные и конечные комментарии \r\r Отступы, круглые и фигурные скобки \r\r Имена идентификаторов \r\r Порядок включения заголовочных файлов \r\r Защита заголовков \r\r Использование пространств имен \r\r Функции require() и assure()
Приложение Б. Рекомендации по программированию \r\r Алфавитный указатель