Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
360
Добавлен:
13.08.2013
Размер:
7.47 Mб
Скачать

Р.Вайнер, Л.Пинсон

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

Соседние файлы в предмете Программирование на C++