Вайнер Р., Пинсон Л. - C++ изнутри - 2000
.pdfР.Вайнер, Л.Пинсон
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 |