Uploaded by KPOIII

297 - C++ Изнутри - Р. Вайнер, Л. Пинсон

advertisement
Р.Вайнер, Л.Пинсон
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
Download