Язык программирования C++. Специальное издание [Бьерн Страуструп] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

язык C++
ПРОГРАММИРОВАНИЯ

специальное издание

Бьерн Страуструп
создатель С++
БИНОМ

ИЗДАНИЕ 2010

язык f!++
ПРОГРАММИРОВАНИЯ

специальное издание

The

C++
Programming
Language
Special Edition

Bjarne Stroustrup
AT&T Labs
Murray Hill, New Jersey

Addison-Wesley
An Imprint of Addison Wesley Longman, Inc.

Бьерн Страуструп

Язык
программирования

C++
Специальное издание

Перевод с английского
под редакцией
Н.Н. Мартынова

Москва
Издательство БИНОМ

2019

УДК 004.43
ББК 32.973.26-018.1
С83

Бьерн Страуструп
Язык программирования C++. Специальное издание. Пер. с англ. —М.:
Издательский дом Бином, 2019 г. — 1136 с.: ил.

Книга написана Бьерном Страуструпом - автором языка программирования C++ и является каноническим изложением возможностей этого языка. Помимо подробного
описания собственно языка, на страницах книги вы найдете доказавшие свою эффектив­
ность подходы к решению разнообразных задач проектирования и программирования.
Многочисленные примеры демонстрируют как хороший стиль программирования на
С-совместимом ядре C++, так и современный объектно-ориентированный подход к соз­
данию программных продуктов.
Книга адресована программистам, использующим в своей повседневной работе C++.
Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться
с описанием языка «из первых рук».

Все права защищены. Никакая часть этой книги не может быть воспроизведена в любой форме или любыми
средствами, электронными или механическими, включая фотографирование, магнитную запись или иные
средства копирования или сохранения информации без письменного разрешения издательства.

Translation copyright © 2010 by Binom Publishers.
C++ Programming Language, The: Special Edition,
First Edition by Bjarne Stroustrup, Copyright © 2000, All Rights Reserved.
Published by arrangement with the original publisher, Addison Wesley Longman, a Pearson Education Company.

ISBN 978-5-7989-0425-9 (pyc.)
ISBN 0-201-70073-5 (англ.)

© Addison Wesley Longman,
a Pearson Education Company, 2000
© Издание на русском языке.
Издательство Бином, 2012

Краткое содержание

Предисловие переводчика и редактора.......................................................................... 25
Предисловие автора к третьему русскому изданию.................................................... 26
Предисловие........................................................................................................................... 29
Предисловие ко второму изданию.................................................................................. 31
Предисловие к первому изданию..................................................................................... 33

Введение.................................................................................................................................35
1. Обращение к читателю................................................................................................. 37
2. Обзор языка C++........................................................................................................ 59
3. Обзор стандартной библиотеки.................................................................................. 85
Часть I. Основные средства............................................................................................. 111
4. Типы и объявления..................................................................................................... 113
5. Указатели, массивы и структуры.............................................................................. 133
6. Выражения и операторы............................................................................................. 155
7. Функции....................................................................................................................... 195
8. Пространства имен и исключения.......................................................................... 219
9. Исходные файлы и программы.............................................................................. 253
Часть II. Механизмы абстракции.................................................................................. 281
10. Классы........................................................................................................................... 283
11. Перегрузка операций................................................................................................. 327
12. Наследование классов................................................................................................. 371
13. Шаблоны....................................................................................................................... 401
14. Обработка исключений............................................................................................. 433
15. Иерархии классов........................................................................................................ 473
Часть III. Стандартная библиотека............................................................................... 515
16. Организация библиотеки и контейнеры............................................................... 517
17. Стандартные контейнеры......................................................................................... 555
18. Алгоритмы и классы функциональных объектов................................................ 607
19. Итераторы и аллокаторы......................................................................................... 655
20. Строки........................................................................................................................... 689
21. Потоки........................................................................................................................... 717
22. Классы для математических вычислений............................................................... 775

6

Язык программирования C++

Часть IV. Проектирование с использованием C++....................................................809
23. Общий взгляд на разработку программ. Проектирование................................... 811
24. Проектирование и программирование................................................................... 849
25. Роли классов................................................................................................................ 895

Приложения и предметный указатель....................................................................... 923
А. Грамматика................................................................................................................... 925
В. Совместимость............................................................................................................ 947
С. Технические подробности......................................................................................... 961
D. Локализация................................................................................................................ 1007
Е. Исключения и безопасность стандартной библиотеки..................................... 1077
Предметный указатель...................................................................................................1117

Содержание

Предисловие переводчика и редактора.......................................................................... 25
Предисловие автора к третьему русскому изданию............... .................................... 26
Предисловие........................................................................................................................... 29
Предисловие ко второму изданию.................................................................................. 31
Предисловие к первому изданию...................................................................................... 33

Введение................................................................................................................................. 35
Глава 1. Обращение к читателю...................................................................................... 37
1.1. Структура книги.....................................................................................................37
1.1.1. Примеры и ссылки............................................................................................... 39
1.1.2. Упражнения.......................................................................................................... 40
1.1.3. Замечания о конкретных реализациях языка (компиляторах).....................40
1.2. Как изучать C++.................................................................................................... 40
1.3. Как проектировался C++..................................................................................... 42
1.3.1. Эффективность и структура............................................................................. 43
1.3.2. Философские замечания.................................................................................... 44
1.4. Исторические замечания..................................................................................... 45
1.5. Применение C++.................................................................................................... 47
1.6. Языки С и C++........................................................................................................ 49
1.6.1. Информация для С-программистов................................................................... 50
1.6.2. Информация для С++-программистов............................................................50
1.7. Размышления о программировании на C++.................................................... 51
1.8. Советы....................................................................................................................... 53
1.8.1. Литература............................................................................................................. 54
Глава 2. Обзор языка C++.................................................................................................. 59
2.1. Что такое язык C++?............................................................................................. 59
2.2. Парадигмы программирования.............................
60
2.3. Процедурное программирование.......................................................................61
2.3.1. Переменные и простейшая арифметика........................................................ 62
2.3.2. Операторы ветвления и циклы.......................................................................... 63
2.3.3. Указатели и массивы............................................................................................64
2.4. Модульное программирование.............................................................................. 65
2.4.1. Раздельная компиляция.................................................................................... 67
2.4.2. Обработка исключений..................................................................................... .68

8

Язык программирования С++

2.5. Абстракция данных.................................................................................................69
2.5.1. Модули, определяющие типы.......................................................................... 69
2.5.2. Типы, определяемые пользователем............................................................... 71
2.5.3. Конкретные типы............................................................................................... 73
2.5.4. Абстрактные типы............................................................................................... 74
2.5.5. Виртуальные функции........................................................................................ 77
2.6. Объектно-ориентированное программирование............................................ 77
2.6.1. Проблемы, связанные с конкретными типами............................................. 78
2.6.2. Классовые иерархии........................................................................................... 79
2.7. Обобщенное программирование..................................................
2.7.1. Контейнеры..........................................................................................................81
2.7.2. Обобщенные алгоритмы.................................................................................... 82
2.8. Заключение................................................................................................................ 84
2.9. Советы....................................................................................................................... 84
Глава 3. Обзор стандартной библиотеки.......................................................................... 85
3.1. Введение................................................................................................................... 85
3.2. Hello, world! (Здравствуй, мир!).......................................................................... 86
3.3. Пространство имен стандартной библиотеки.................................................... 87
3.4. Вывод....................................................................................................................... 87
3.5. Строки....................................................................................................................... 88
3.5.1. С-строки............................................................................................................. 90
3.6. Ввод........................................................................................................................... 90
3.7. Контейнеры............................................................................................................ 92
3.7.1. Контейнер vector.................................................................................................. 93
3.7.2. Проверка диапазона индексов......................................................................... 94
3.7.3. Контейнер list...................................................................................................... 95
3.7.4. Контейнер тар.................................................................................................. 96
3.7.5. Контейнеры стандартной библиотеки...............................................................97
3.8. Алгоритмы............................................................................................................... 98
3.8.1. Использование итераторов................................................................................ 99
3.8.2. Типы итераторов................................................................................................101
3.8.3. Итераторы и ввод/вывод................................................................................. 102
3.8.4. Алгоритм for_each и предикаты.......................................................................103
3.8.5. Алгоритмы, использующие функции-члены классов................................... 105
3.8.6. Алгоритмы стандартной библиотеки................................................................106
3.9. Математические вычисления.............................................................................. 107
3.9.1. Комплексные числа............................................................................................ 107
3.9.2. Векторная арифметика..................................................................................... 107
3.9.3. Поддержка базовых вычислительных операций.......................................... 108
3.10. Основные средства стандартной библиотеки................................................ 108
3.11. Советы.................................................................................................................... 109
Часть I. Основные средства............................................................................................. "111

Глава 4. Типы и объявления........................................................................................... ИЗ
4.1. Типы................................................................................
4.1.1. Фундаментальные типы.................................................................................... 114
4.2. Логический тип..................................................................................................... ИЗ

Содержание

9

4.3. Символьные типы................................................................................................. 116
4.3.1. Символьные литералы..................................................................................... 117
4.4. Целые типы............................................................................................................ 118
4.4.1. Целые литералы................................................................................................118
4.5. Типы с плавающей запятой.............................................................................. 119
4.5.1. Литералы с плавающей запятой....................................................................... 119
4.6. Размеры.................................................................................................................... 119
4.7. Тип void.................................................................................................................... 121
4.8. Перечисления......................................................................................................... 122
4.9. Объявления............................................................................................................ 123
4.9.1. Структура объявления........................................................................................ 125
4.9.2. Объявление нескольких имен.......................................................................... 126
4.9.3. Имена................................................................................................................. 126
4.9.4. Область видимости............................................................................................ 127
4.9.5. Инициализация................................................................................................... 129
4.9.6. Объекты и леводопустимые выражения (lvalue).......................................... 130
4.9.7. Ключевое слово typedef..................................................................................... 130
4.10. Советы.................................................................................................................... 131
4.11. Упражнения.........................................................................................................132

Глава 5. Указатели, массивы и структуры....................................................................... 133
5.1. Указатели................................................................................................................ 133
5.1.1. Нуль..................................................................................................................... 134
5.2. Массивы.................................................................................................................... 135
5.2.1. Инициализация массивов................................................................................. 135
5.2.2. Строковые литералы........................................................................................ 136
5.3. Указатели на массивы.......................................................................................... 138
5.3.1. Доступ к элементам массивов.......................................................................... 139
5.4. Константы................................................................................................................ 141
5.4.1. Указатели и константы..................................................................................... 143
5.5. Ссылки.................................................................................................................... 144
5.6. Тип void*................................................................................................................ 148
5.7. Структуры................................................................................................................ 149
5.7.1. Эквивалентность типов..................................................................................... 152
5.8. Советы.................................................................................................................... 152
5.9. Упражнения............................................................................................................ 152
Глава 6. Выражения и операторы................................................................................... 155
6.1. Калькулятор............................................................................................................ 155
6.1.1. Синтаксический анализатор.............................................................................. 156
6.1.2. Функция ввода................................................................................................... 161
6.1.3. Низкоуровневый ввод........................................................................................ 163
6.1.4. Обработка ошибок............................................................................................ 164
6.1.5. Управляющая программа................................................................................. 165
6.1.6. Заголовочные файлы........................................................................................ 166
6.1.7. Аргументы командной строки.......................................................................... 167
6.1.8. Замечания о стиле............................................................................................ 169
6.2. Обзор операций языка C++.............................................................................. 169
6.2.1. Результаты операций........................................................................................ 171

10

Язык программирования C++

6.2.2.
6.2.3.
6.2.4.
6.2.5.
6.2.6.

Последовательность вычислений................................................................... 172
Приоритет операций...................................
173
Побитовые логическиеоперации.....................................................................174
Инкремент и декремент..................................................................................... 175
Свободная память................................................................................................177

6.2.6.1. Массивы............................................................................................................................ 179
6.2.6.2. Исчерпание памяти..................................................................................................... 180

6.2.7. Явное приведение типов................................................................................. 181
6.2.8. Конструкторы................................................................................................... 182
6.3. Обзор операторов языка C++........................................................................... 183
6.3.1. Объявления как операторы.............................................................................. 184
6.3.2. Операторы выбора (условные операторы)..................................................... 185
6.3.2.1. Объявления в условиях................................................................................................. 187

6.3.3. Операторы цикла...............................................................

188

6.3.3.1. Объявления в операторах цикла for........................................................................... 189

6.3.4. Оператор goto....................................................................................................... 189
6.4. Комментарии и отступы...................................................................................... 190
6.5. Советы.................................................................................................................... 192
6.6. Упражнения............................................................................................................ 192

Глава 7. Функции.............................................................................................................. 195
7.1. Объявления функций..........................................................................................195
7.1.1. Определения функций..................................................................................... 196
7.1.2. Статические переменные................................................................................. 197
7.2. Передача аргументов............................................................................................. 197
7.2.1. Массивы в качестве аргументов.......................................................................199
7.3. Возвращаемое значение......................................................................................200
7.4. Перегрузка имен функций.................................................................................. 201
7.4.1. Перегрузка и возвращаемые типы................................................................... 204
7.4.2. Перегрузка и области видимости................................................................... 204
7.4.3. Явное разрешение неоднозначностей............................................................ 204
7.4.4. Разрешение в случае нескольких аргументов................................................. 205
7.5. Аргументы по умолчанию.................................................................................. 206
7.6. Неуказанное число аргументов.......................................................................... 207
7.7. Указатели на функции......................................................................................... 209
7.8. Макросы................................................................................................................... 213
7.8.1. Условная компиляция........................................................................................ 215
7.9. Советы................................................................................................................... 216
7.10. Упражнения........................................................................................................ 217

Глава 8. Пространства имен и исключения...................................................................219
8.1. Разбиение на модули и интерфейсы.................................................................. 219
8.2. Пространства имен............................................................................................. 221
8.2.1. Квалифицированные имена............................................................................. 223
8.2.2. Объявления using............................................................................................... 224
8.2.3. Директивы using............................................................................................... 226
8.2.4. Множественные интерфейсы.......................................................................... 227
8.2.4.1. Альтернативы интерфейсам......................................................................................... 229

8.2.5. Как избежать конфликта имен...................................................................... 231
8.2.5.1. Неименованные пространства имен.......................................................................... 232

Содержание

11

8.2.6. Поиск имен.......................................................................................................... 233
8.2.7. Псевдонимы пространств имен...................................................................... 234
8.2.8. Композиция пространств имен...................................................................... 235
8.2.8.1. Отбор отдельных элементов из пространства имен............................................ 236
8.2.8.2. Композиция пространств имен и отбор элементов............................................ 237

8.2.9. Пространства имен и старый код................................................................... 238
8.2.9.1. Пространства имен и язык С...................................................................................... 238
8.2.9.2. Пространства имен и перегрузка.............................................................................. 239
8.2.9.3. Пространства имен открыты......................................................................................240

8.3. Исключения............................................................................................................ 241
8.3.1. Ключевые слова throw и catch.......................................................................... 242
8.3.2. Обработка нескольких исключений............................................................... 244
8.3.3. Исключения в программе калькулятора........................................................ 246
8.3.3.1. Альтернативные стратегии обработки ошибок........................................................249

8.4. Советы................................................................................................................ 251
8.5. Упражнения............................................................................................................ 252
Глава 9. Исходные файлы и программы.......................................................................253
9.1. Раздельная компиляция..................................................................................... 253
9.2. Компоновка (linkage)............................................................................................. 254
9.2.1. Заголовочные файлы........................................................................................ 257
9.2.2. Заголовочные файлы стандартной библиотеки............................................. 259
9.2.3. Правило одного определения.......................................................................... 260
9.2.4. Компоновка с кодом, написанном не на языке C++................................... 262
9.2.5. Компоновка и указатели на функции............................................................ 264
9.3. Применяем заголовочные файлы...................................................................... 265
9.3.1. Единственный заголовочный файл............................................................... 265
9.3.2. Несколько заголовочных файлов................................................................... 268
9.3.2.1. Остальные модули калькулятора.............................................................................. 271
9.3.2.2. Использование заголовочных файлов.......................................................................273

9.3.3. Защита от повторных включений................................................................... 274
9.4. Программы............................................................................................................ 275
9.4.1. Инициализация нелокальных переменных.....................................................275
9.4.1.1. Завершение выполнения программы.......................................................................276

9.5. Советы................................................................................................................... 278
9.6. Упражнения............................................................................................................ 278
Часть II. Механизмы абстракции.........................................................

281

Глава 10. Классы.............................................................................................................. 283
10.1. Введение................................................................................................................283
10.2. Классы................................................................................................................... 284
10.2.1. Функции-члены...............................................................
284
10.2.2. Управление режимом доступа...................................................................... 285
10.2.3. Конструкторы................................................................................................... 287
10.2.4. Статические члены........................................................................................ 288
10.2.5. Копирование объектов класса...................................................................... 290
10.2.6. Константные функции-члены...................................................................... 290
10.2.7. Ссылки на себя............................................................................................... 291
10.2.7.1. Физическое и логическое постоянство................................................................... 292
10.2.7.2. Ключевое слово mutable............................................................................................. 294

12

Язык программирования C++

10.2.8. Структуры и классы........................................................................................ 295
10.2.9. Определение функций в теле определения класса...................................... 296
10.3. Эффективные пользовательские типы........................................................... 297
10.3.1. Функции-члены............................................................................................... 300
10.3.2. Функции поддержки (helper functions)........................................................ 302
10.3.3. Перегруженные операции............................................................................. 303
10.3.4. Роль конкретных классов..............................................................................303
10.4. Объекты................................................................................................................ 304
10.4.1. Деструкторы...................................................................................................... 305
10.4.2. Конструкторы по умолчанию.......................................................................... 306
10.4.3. Конструирование и уничтожение объектов................................................. 307
10.4.4. Локальные объекты........................................................................................ 307
10.4.4.1. Копирование объектов............................................................................................. 308

10.4.5. Динамическое создание объектов в свободной памяти............................ 309
10.4.6. Классовые объекты как члены классов........................................................ 310
10.4.6.1. Обязательная инициализация членов................................................................... 311
10.4.6.2. Члены-константы........................................................................................................ 312
10.4.6.3. Копирование членов................................................................................................. 313

10.4.7. Массивы............................................................................................................. 314
10.4.8. Локальные статические объекты................................................................... 315
10.4.9. Нелокальные объекты.....................................................................................316
10.4.10. Временные объекты........................................................................................ 318
10.4.11. Размещение объектов в заданных блоках памяти................................... 319
10.4.12. Объединения...................................................................
321
10.5. Советы................................................................................................................... 322
10.6. Упражнения........................................................................................................ 323
Глава 11. Перегрузка операций...................................................................................... 327
11.1. Введение................................................................................................................ 327
11.2. Функции-операции............................................................................................. 329
11.2.1. Бинарные и унарные операции...................................................................... 330
11.2.2. Предопределенный смысл операций............................................................ 331
11.2.3. Операции и пользовательские типы............................................................ 331
11.2.4. Операции и пространства имен................................................................... 332
11.3. Тип комплексных чисел......................................................................................334
11.3.1. Перегрузка операций функциями-членами и глобальными функциями 334
11.3.2. Смешанная арифметика................................................................................... 336
11.3.3. Инициализация............................................................................................... 337
11.3.4. Копирование................................................................................................... 338
11.3.5. Конструкторы и преобразования типов........................................................ 339
11.3.6. Литералы.......................................................................................................... 340
11.3.7. Дополнительные функции-члены............................................................... 341
11.3.8. Функции поддержки (helper functions)........................................................ 341
11.4. Операции приведения типов.......................................................................... 342
11.4.1. Неоднозначности............................................................................................ 344
11.5. Друзья класса........................................................................................................ 346
11.5.1. Поиск друзей...................................................................................................348
11.5.2. Функции-члены или друзья?.......................................................................... 349
11.6. Объекты больших размеров.............................................................................. 350

Содержание

13

11.7. Важные операции................................................................................................. 352
11.7.1. Конструктор с модификатором explicit........................................................ 353
11.8. Индексирование................................................................................................. 355
11.9. Функциональный вызов......................................................................................356
11.10. Разыменование................................................................................................. 358
11.11. Инкремент и декремент.................................................................................. 360
11.12. Класс строк........................................................................................................ 362
11.13. Советы................................................................................................................ 367
11.14. Упражнения........................................................................................................ 368
Глава 12. Наследование классов...................................................................................... 371
12.1. Введение............................................................................................................. 371
12.2. Производные классы......................................................................................... 372
12.2.1. Функции-члены............................................................................................... 375
12.2.2. Конструкторы и деструкторы.......................................................................... 376
12.2.3. Копирование................................................................................................... 378
12.2.4. Иерархии классов............................................................................................ 378
12.2.5. Поля типа.......................................................................................................... 379
12.2.6. Виртуальные функции................................................................................. 381
12.3. Абстрактные классы......................................................................................... 384
12.4. Проектирование иерархий классов............................................................... 386
12.4.1. Традиционные иерархии классов................................................................... 387
12.4.1.1. Критика........................................................................................................................389

12.4.2. Абстрактные классы........................................................................................ 390
12.4.3. Альтернативные реализации.......................................................................... 393
12.4.3.1. Критика........................................................................................................................395

12.4.4. Локализация создания объектов................................................................... 395
12.5. Классовые иерархии и абстрактные классы................................................ 397
12.6. Советы....................................................................................................................397
12.7. Упражнения...............................................................
398

Глава 13. Шаблоны.......................................................................................................... 401
13.1. Введение................................................................................................................ 401
13.2. Простой шаблон строк..................................................................................... 402
13.2.1. Определение шаблона.................................................................................... 404
13.2.2. Конкретизация шаблона (template instantiation).......................................... 406
13.2.3. Параметры шаблонов.................................................................................... 406
13.2.4. Эквивалентность типов................................................................................. 407
13.2.5. Проверка типов............................................................................................... 408
13.3. Шаблоны функций............................................................................................. 409
13.3.1. Аргументы функциональных шаблонов........................................................ 410
13.3.2. Перегрузка функциональных шаблонов.................................................... 411
13.4. Применение аргументов шаблона для формирования различных
вариантов поведения кода......................................................................... 414
13.4.1. Параметры шаблонов по умолчанию............................................................415
13.5. Специализация.................................................................................................... 417
13.5.1. Порядок специализаций................................................................................. 420
13.5.2. Специализация шаблонов функций............................................................420
13.6. Наследование и шаблоны.................................................................................. 422

14

Язык программирования С++

13.6.1. Параметризация и наследование...................................................................424
13.6.2. Шаблонные члены шаблонов...................................................................... 424
13.6.3. Отношения наследования............................................................................. 425
13.6.3.1. Преобразования шаблонов..................................................................................... 426

13.7. Организация исходного кода.......................................................................... 427
13.8. Советы................................................................................................................... 430
13.9. Упражнения........................................................................................................ 431

Глава 14. Обработка исключений.................................................................................. 433
14.1. Обработка ошибок............................................................................................. 433
14.1.1. Альтернативный взгляд на исключения........................................................ 436
14.2. Группировка исключений.................................................................................. 437
14.2.1. Производные исключения............................................................................. 438
14.2.2. Композитные (комбинированные) исключения.......................................... 440
14.3. Перехват исключений......................................................................................... 441
14.3.1. Повторная генерация исключений............................................................... 441
14.3.2. Перехват любых исключений.......................................................................... 442
14.3.2.1. Порядок записи обработчиков.................................................................................. 443

14.4. Управление ресурсами..................................................................................... 444
14.4.1. Использование конструкторов и деструкторов.......................................... 446
14.4.2. Auto_ptr............................................................................................................. 447
14.4.3. Предостережение............................................................................................449
14.4.4. Исключения и операция new.......................................................................... 449
14.4.5. Исчерпание ресурсов.................................................................................... 450
14.4.6. Исключения в конструкторах..........................................................
14.4.6.1. Исключения и инициализация членов классов.................................................... 454
14.4.6.2. Исключения и копирование......................................................................................454

14.4.7. Исключения в деструкторах.......................................................................... 455
14.5. Исключения, не являющиеся ошибками....................................................... 455
14.6. Спецификация исключений.............................................................................. 457
14.6.1. Проверка спецификации исключений........................................................ 458
14.6.2. Неожиданные исключения............................................................................. 459
14.6.3. Отображение исключений............................................................................. 460
14.6.3.1. Отображение исключений пользователем........................................................... 460
14.6.3.2. Восстановление типа исключения.......................................................................... 461

14.7. Неперехваченные исключения...................................................................... 462
14.8. Исключения и эффективность...................................................................... 464
14.9. Альтернативы обработке ошибок................................................................... 465
14.10. Стандартные исключения.............................................................................. 467
14.11. Советы................................................................................................................469
14.12. Упражнения........................................................................................................ 470

Глава 15. Иерархии классов.............................................................................................. 473
15.1. Введение и обзор................................................................................................. 473
15.2. Множественное наследование.......................................................................... 474
15.2.1. Разрешение неоднозначности...................................................................... 475
15.2.2. Наследование и using-объявление............................................................... 477
15.2.3. Повторяющиеся базовые классы................................................................... 478
15.2.3.1. Замещение................................................................................................................... 479

15.2.4. Виртуальные базовые классы.......................................................................... 480

452

Содержание

15

15.2.4.1. Программирование виртуальных базовых классов............................................ 482

15.2.5. Применение множественного наследования............................................. 484
15.2.5.1. Замещение функций виртуальных базовых классов............................................ 486

15.3. Контроль доступа.................................................................................................487
15.3.1. Защищенные члены классов.......................................................................... 489
15.3.1.1. Применение защищенных членов класса........................................................... 490

15.3.2. Доступ к базовым классам............................................................................. 491
15.3.2.1. Множественное наследование и контроль доступа............................................ 492
15.3.2.2. Множественное наследование и контроль доступа............................................ 493

15.4. Механизм RTTI (Run-Time Type Information)............................................ 493
15.4.1. Операция dynamic_cast.................................................................................... 495
15.4.1.1. Применение dynamic_cast к ссылкам................................................................... 497

15.4.2. Навигация по иерархиям классов...................................................................498
15.4.2.1. Операции static_cast и dynamic_cast.......................................................................499

15.4.3. Конструирование и уничтожение классовых объектов............................... 501
15.4.4. Операция typeid и расширенная информация о типе............................... 501
15.4.4.1. Расширенная информация о типе.......................................................................... 502

15.4.5. Корректное и некорректное применение RTTI.......................................... 504
15.5. Указатели на члены классов.............................................................................. 505
15.5.1. Базовые и производные классы................................................................... 508
15.6. Свободная память................................................................................................. 509
15.6.1. Выделение памяти под массивы................................................................... 511
15.6.2. «Виртуальные конструкторы»...................................................................... 511
15.7. Советы................................................................................................................... 513
15.8. Упражнения........................................................................................................ 514

Часть III. Стандартная библиотека............................................................................... 515
Глава 16. Организация библиотеки и контейнеры....................................................... 517
16.1. Проектные решения стандартной библиотеки.............................................. 517
16.1.1. Проектные ограничения.................................................................................................518

16.1.2. Организация стандартной библиотеки........................................................ 520
16.1.3. Непосредственная поддержка языка C++.................................................... 523
16.2. Дизайн контейнеров......................................................................................... 524
16.2.1. Специализированные контейнеры и итераторы.......................................... 524
16.2.2. Контейнеры с общим базовым классом........................................................ 527
16.2.3. Контейнеры STL............................................................................................... 531
16.3. Контейнер типа vector......................................................................................533
16.3.1. Типы................................................................................................................. 533
16.3.2. Итераторы.......................................................................................................... 535
16.3.3. Доступ к элементам........................................................................................ 536
16.3.4. Конструкторы...................................................................................................538
16.3.5. Стековые операции.....................................................
541
16.3.6. Операции над векторами, характерные для списков................................... 543
16.3.7. Адресация элементов.....................................................................................546
16.3.8. Размер и емкость............................................................
547
16.3.9. Другие функции-члены................................................................................. 549
16.3.10. Вспомогательные функции (helper functions)..............................................550
16.3.11. Специализация vector...................................................................... 550
16.4. Советы................................................................................................................... 551
16.5. Упражнения........................................................................................................ 552

16

Язык программирования С++

Глава 17. Стандартные контейнеры.............................................................................. 555
17.1. Стандартные контейнеры.................................................................................. 555
17.1.1. Обзор контейнерных операций...................................................................... 556
17.1.2. Краткий обзор контейнеров.......................................................................... 559
17.1.3. Внутреннее представление............................................................................. 560
17.1.4. Требования к элементам контейнеров........................................................ 561
17.1.4.1. Операция сравнения "