Вы находитесь на странице: 1из 297

Р.Вайнер, Л.

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

Вам также может понравиться