Р.Вайнер, Л.Пинсон C++ ИЗНУТРИ Эта книга представляет собой набор примеров с сопровождающими объяснениями, которые иллюстрируют наиболее важные возможности языка C++ версии 2.0 с концентрацией на решении объектно-ориентированных проблем. Программисты, желающие использовать C++, смогут значительно ускорить процесс изучения, если будут иметь перед глазами хорошо написанные программы, сопровождаемые ясными комментариями, которые позволяют шаг за шагом освоить приемы программирования на C++. Основная цель книги состоит в демонстрации преимуществ объектноориентированного программирования и в поощрении использования объектноориентированных возможностей C++. Подробно рассматриваются новейшие возможности C++, включая множественное наследование, которому посвящен целый раздел, содержащий множество примеров. В книге имеется ряд вопросов "Что если", которые предвосхищают те вопросы, которые могут возникнуть у читателя. Эти вопросы позволяют более детально изучить рассматриваемый предмет. Целью книги является дополнение растущего множества книг по C++. Эта книга предназначена для профессиональных программистов, специалистов по компьютерам, студентов, изучающих компьютеры, руководителей групп программистов и инженеров желающих в полной мере использовать возможности языка C++. Содержание Предисловие 5 Глава 1. C++ и объектно-ориентированное программирование 7 1.1 Введение 7 1.2 Объект, сообщение, класс, экземпляр объекта и метод 9 1.2.1 Определения 9 1.2.2 Выражения: передача сообщений объектам 11 1.2.3 Создание объектов и инициализация данных состояния 12 1.3 Абстракция, инкапсуляция, наследование и полиморфизм: четыре 13 основных свойства 1.3.1 Абстракция и инкапсуляция 14 1.3.1-1 Объекты в свете инкапсуляции и абстракции 14 1.3.1-2 Протокол описания класса: поля данных и функции члены 15 1.3.2 Наследование 16 1.3.2-1 Иерархия классов против зависимости классов 17 1.3.2-2 Одиночное наследование, базовые и производные классы 18 1.3.2-3 Множественное наследование и виртуальные базовые 18 классы 1.3.3 Полиморфизм 18 1.3.3-1 Перегрузка функций 19 1.3.3-2 Перегрузка операций 19 1.3.3-3 Виртуальные функции и позднее связывание 20 1.3.3-4 Семейства 1.4 Дополнительные объектно-ориентированные свойства Глава 2. Дополнения к С 2.1 Ограничители комментариев 2.2 Прототипы функций 2.3 Операция расширения области видимости 2.4 Объявления в операторах 2.5 Перегрузка функций 2.6 Значения формальных параметров по умолчанию 2.7 Ссылки и параметры ссылки 2.8 Спецификатор inline 2.9 Спецификатор const 2.10 Спецификатор enum 2.11 Операции new и delete 2.12 Связывание с 2.13 Указатель на void Глава 3. Описания протокола класса 3.1 Описание класса 3.1.1 Компоненты описания класса 3.1.2 Введение в потоковые классы 3.1.3 Зарезервированное слово this 3.2 Первый пример класса 3.2.1 Проверку протокола класса First 3.3 Создание объектов С-типов: второй пример класса 3.3.1 Класс Integer: протокол описания класса 3.3.2 Класс Integer: тестовая программа 3.4 Разделение прототипов и определений для функций-членов класса: третий пример описания класса 3.4.1 Класс Fraction: прототипы 3.4.2 Класс Fraction: определения 3.4.3 Класс Fraction : тестовая программа 3.5 Указатели на объекты и использование операции new 3.5.1 Класс StringHolder: прототип и определение 3.5.2 Класс StringHolder: тестовая программа 3.6 Конструкторы и массивы объектов 3.7 Инициализация полей и статических переменных Глава 4. Дружественные функции и перегрузка операций 4.1 Перегрузка операций 4.2 Дружественные функции 4.3 Оператор присваивания 4.4 Присваивание против инициализации 4.4.1 Присваивание 4.4.2 Инициализация 4.5 Перегруженные операции - функции-члены против дружественных 21 21 23 23 23 25 26 26 29 31 37 38 39 39 40 41 44 44 44 47 48 49 52 55 55 57 59 59 61 63 65 66 67 69 73 76 76 80 82 84 84 85 90 функций 4.6 Перегруженные операции new, delete и -> 4.6.1 Операции new и delete 4.6.2 Операция -> 4.7 Контейнерные классы 4.7.1 Анализ результатов работы 4.8 И снова класс Integer Глава 5. Преобразование типов 5.1 Операции преобразования типов 5.2 Неявное преобразование типов 5.3 Еще о преобразовании типов 5.4 Достижение высокой эффективности Глава 6. Производные классы: одиночное наследование 6.1 Производные классы и правила наследования 6.2 Открытые и закрытые производные классы: первые два примера производных классов 6.3 Правила доступа для классов и объектов 6.3.1 Защищенные части классов 6.3.1-1 Доступ к протоколу класса 6.3.1 -2 Доступ через протокол производного класса 6.3.1 -3 Доступ через объекты класса 6.3.1 -4 Доступ через объекты public-производного класса 6.3.1 -5 Доступ через объекты private-производного класса 6.3.2 Защищенная часть классов 6.3.2-1 Доступ через протокол класса 6.3.2-2 Доступ через протокол производного класса 6.3.2-3 Доступ через объекты класса 6.3.2-4 Доступ через объекты public-производного класса 6.3.2-5 Доступ через объекты private-производного класса 6.3.3 Открытая часть классов 6.3.3-1 Доступ через протокол класса 6.3.3-2 Доступ через протокол производного класса 6.3.3-3 Доступ через объекты класса 6.3.3-4 Доступ через объекты public-производного класса 6.3.3-5 Доступ через объекты private-производного класса 6.3.4 Обобщение правил доступа для классов и объектов закрытых, защищенных и открытых частей описания класса 6.4 Иерархии классов против контейнерных классов 6.4.1 Собака "является" псовым, но "содержит" хвост 6.4.2 Типичный пример использования иерархии класса 6.4.3 Типичный пример использования контейнерных классов 6.5 Правила доступа для друзей классов и производных классов 6.5.1 Простой пример доступа через друзей класса 6.5.2 Дружественные и производные классы 99 99 100 104 111 118 122 122 132 136 141 145 145 147 154 157 157 157 157 158 159 159 160 160 160 160 160 161 161 161 161 162 162 162 163 163 168 172 176 176 179 6.5.3 Суммарные правила доступа для дружественных и производных классов к закрытым, защищенным и открытым частям описаний класса Глава 7. Виртуальные функции и полиморфизм 7.1 Виртуальные функции и полиморфические кластеры 7.2 Проверка ошибок при использовании виртуальных функций 7.3 Техническая реализация виртуальных функций 7.4 Преимущества позднего связывания 7.5 Приложение, использующее виртуальные функции 7.6 Обслуживание с помощью деревьев выражений Глава 8. ООП в действии: экологическое моделирование 8.1 Проектирование экологической модели 8.1.1 Общее описание программной системы экологического моделирования 8.1.2 Первичные объекты проекта: начальная иерархия классов 8.1.3 Минимальная спецификация 8.1.4 Начальный проект: поддержка объектов 8.1.4-1 Для объектов класса Ocean 8.1.4-2 Для объектов класса Cell 8.1.4-3 Для объектов класса Prey 8.1.4-4 Для объектов класса Predator 8.1.4-5 Для объектов класса Obstacle 8.1.4-6 Для объектов класса Coordinate 8.1.5 Равные сообщения: начальная иерархия 8.1.5-1 Для объектов класса Ocean 8.1.5-2 Для объектов класса Cell 8.1.5-3 Для объектов класса Prey 8.1.5-4 Для объектов класса Predator 8.1.5-5 Для объектов класса Obstacle 8.1.6 Начальный проект: высокоуровневые выражения 8.1.7 Уточнение начального проекта 8.2 Файлы интерфейса: описание классов, прототипы и определения функций-членов 8.3 Основная программа 8.4 Файлы реализации: определения дополнительных функций-членов 8.5 Пример результатов моделирования океана 8.6 Заключительные комментарии Глава 9. Производные классы: множественное наследование 9.1 Введение 9.2 Первый пример 9.3 Конфликты имен 9.4 Порядок вызова конструкторов 9.5 Виртуальные базовые классы Список листингов 188 191 191 201 202 204 205 217 227 227 228 229 230 230 232 232 133 233 233 234 234 234 235 236 236 237 237 238 240 249 250 259 264 264 265 269 273 278 Глава 2 2.1 Операция расширения области видимости 25 2.2 Перегруженные функции 27 2.3 Значения по умолчанию в функциях 29 2.4 Пример инициализации ссылочной переменной 33 2.5 Параметры-ссылки против параметров-указателей 34 2.6 Тонкости при использовании ссылок 35 2.7 Польза от использования функций inline 37 2.8 Родовая функция swap 42 Глава 3 3. 1 Синтаксис описания класса 45 3.2 Внешнее определение функции-члена 46 3.3 Интерфейс с классом First 50 3.4 Тестовая программа для класа First 52 3.5 Интерфейс класса Integer 56 3.6 Тестовая программа для класса Integer 57 3.7 Интерфейс класса Fraction 59 3.8 Реализация функций-членов класса Fraction 61 3.9 Программа проверки класса Fraction 63 3.10 Класс StringHolder: интерфейс 66 3.11 Класс StringHolder: реализиция 66 3.12 Тестовая программа для класса StringHolder 67 3.13 Тест для вектора объектов класса First 69 3.14РезультатытестаклассаРи .1, который не имеет конструкторов 71 72 3.15 Тестовая программа, содержащая одиночные объекты класса First с одним конструктором, который имеет два параметра со значениями по умолчанию 3.16 Инициализация полей класса 73 3.17 Использование статических переменных в качестве полей класса 74 Глава 4 4.1 Класс IntArray 76 4.2 Перегруженная операция [] в классе IntArray 79 4.3 Перегруженная функция «, дружественная классу IntArray. 81 4.4 Присвоение по умолчанию в классе IntArray 83 4.5Определеннаяпользователемоперацияприсваиваниядляклас-са IntArray 83 4.6 Конструктор инициализации для класса IntArray 86 4.7 Демонстрация различных вариантов инициализации. 87 4.8 Файл интерфейса с классом Complex 91 4.9 Реализация класса Complex 93 4.10 Тестовая программа для класса Complex 95 4.11 Операции, объявленные как функции- члены класса Complex 97 4.12 Пример использования операции -> Класс IntArray 101 4.13 Протокол класса Furniture 104 4.14 Протокол класса Room 105 4.16 Основная программа для классов House, Room и Furniture 4.17 Модифицированные конструкторы и деструкторы для класса Room , конструктор инициализации и новая тестовая программа 4.18 Класс Integer с перегруженными операциями 4.19 Тестовая программа для измененного класса Integer Глава 5 5.1 Класс Real 5.2 Тестовая программа для класса Real 5.3 Модифицированный класс Fraction 5.4 Реализация класса Fraction 5.5 Тестовая программа для класса Fraction 5.6 Тестовая программа, иллюстрирующая неявное преобразование типов 5.7 Перегруженная операция + как дружественная классу Integer функция 5.8 Преобразование свинца в золото при помощи конструктора 5.9 Превращение свинца в золото с помощью операции преобразования типа 5.10 Функция с большим временем выполнения 5.11 Ускоренная программа 5.12 Улучшения в классе Integer при использовании спецификатора inline Глава 6 6.1 Синтаксис производных классов 6.2 Базовый класс Account, public-производный класс SpecialAccount и private- производный класс RestrictedAccount 6.3 Тестовая программа для Account классов 6.4Первыйальтернативныйконструктордля класса SpecialAccount без конструкторов в классе Account 6.5 Второй альтернативный конструктор для класса SpecialAccount без конструкторов в классе Account 6.6 Доступ классов, производных классов и объектов 6.7 Интерфейс классов Canine и Tail 6.8 Тестовая пррограмма для классов Canine и Tail 6.9 Интерфейс к иерархии классов Vehicle 6.10 Тестовая программа для иерархии класса Vehicle 6.11 Интерфейс к контейнерному классу SportsCar. 6.12 Тестовая программа для класса SportsCar 6.13 SportsCar, переопределенный как дружественный класс 6.14 Тестовая программа для друзей класса SportsCar 6.15 Интерфейс производного и дружественного классов 6.16 Тестовая программа для производных классов и дружественного класса 6.17 Интерфейс класса производного от дружественного 6.18 Тестовая программа для класса, производного от дружественного 6.19 Дружественные функции производного класса Глава 7 107 114 118 120 123 124 126 127 129 132 135 137 139 142 143 144 146 148 151 154 154 155 164 167 168 170 172 175 176 178 180 183 185 187 188 7.1 Полиморфический кластер 7.2 Использование ссылок для реализации полиморфизма. 7.3 Другая программа с виртуальными функциями 7.4 Статическая проверка и позднее связывание 7.5 Основная программа для деревьев разбора выражений 7.6 Интерфейс класса Tree 7.7 Интерфейс класса Node 7.8 Реализация функций-членов класса Tree 7.9 Интерфейс класса Binary Node 7.10 Файл glodals.h 7.11 Интерфейс класса Unary Node 7.12 Интерфейс класса RealNode 7.13 Реализация класса Binary Node 7.14 Реализация класса Unary Node 7.15 Реализация класса RealNode 7.16 Модифицированное дерево разбора выражения Глава 8 8. 1 Файл интерфейса класса Ocean 8.2 Интерфейсный файл класса Cell 8.3 Интерфейсный файл для класса Prey 8.4 Интерфейсный файл для класса Predator 8.5 Интерфейсный файл для класса Obstacle 8.6 Интерфейсный файл для класса Coordinate 8.7 Интерфейсный файл для класса Random 8.8 Основная программа для системы моделирования океана 8.9 Файл Constants. h 8.10 Реализация деталей класса Ocean 8.11 Реализация деталей класса Cell 8.12 Реализация деталей класса Prey 8.13 Реализация деталей класса Predator 8.14 Реализация деталей класса Random Глава 9 9.1 Первый пример множественного наследования 9.2 Два базовых класса с одинаковыми именами переменных 9.3 Порядок инициализации для конструкторов 9.4 Виртуальные базовые классы для Domestic Animal, Cow, Buffalo и Beefalo 9.5 Виртуальные базовые классы 193 197 198 201 207 209 210 211 212 213 213 214 214 215 216 218 241 243 244 246 246 247 248 249 250 251 255 256 257 258 265 270 273 279 283