- •Глава 2. Модульное программирование 72
 - •Глава 3. Технология создания программ 102
 - •Часть II. Объектно-ориентированное программирование 173
 - •Глава 4. Классы 178
 - •Глава 13. Итераторы и функциональные объекты 328
 - •Глава 14. Алгоритмы 343
 - •Глава 15. Средства для численных расчетов 369
 - •Глава 16. Другие средства стандартной библиотеки 378
 - •Часть 1
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •If ( выражение ) оператор_1; [else оператор_2;]
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •If (f) cout « "ХпРезультат return 0;
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Int* p (&а); // то же самое другим способом
 - •Часть I. Структурное программирование
 - •5 4 2 1 3 // Порядок интерпретации описания
 - •56 Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Int b[nstr][nstb]; // описание массива
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Глава 2
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Int sum(int a. Int b); // объявление функции
 - •Глава 2. Модульное программирование
 - •Void print_worker(Worker); //объявление функции
 - •Часть I. Структурное программирование
 - •Int fl(){return 1;} //правильно
 - •Void f2(){return 1;} // неправильно. F2 не должна возвращать значение
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •92 Часть I. Структурное программирование
 - •Глава 2. Модульное программирование 93
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Void fund (double); // Перегрузка
 - •Void func2(int); // Верно (повторное объявление)
 - •Часть I. Структурное программирование
 - •Глава 2. Модульное программирование
 - •Глава 3
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ 107
 - •II Комментарий, описывающий,
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •If(!remove (&pbeg. &pend. 5))cout « "не найден";
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Глава 3. Технология создания программ
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Int f; //.Частота регенерации
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •168 Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть I. Структурное программирование
 - •Часть II
 - •Часть II. Объектно-ориентированное программирование
 - •Часть II. Объектно-ориентированное программирование
 - •Часть II. Объектно-ориентированное программирование
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4
 - •Глава 4. Классы
 - •180 Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Int a::count: // Определение в глобальной области
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 4. Классы
 - •Глава 5
 - •Глава 5. Наследование
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 5. Наследование
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 5. Наследование
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 5. Наследование
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 5. Наследование
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 6
 - •Часть II. Объектно-ориентированное программирование
 - •Void add(int d): // Добавление узла в конец списка
 - •Глава 6. Шаблоны классов
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 6. Шаблоны классов
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 6. Шаблоны классов
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 6. Шаблоны классов
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 6. Шаблоны классов
 - •Глава 7
 - •Глава 7. Обработка исключительных ситуаций
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 7. Обработка исключительных ситуаций
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 7. Обработка исключительных ситуаций
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 7. Обработка исключительных ситуаций
 - •230 Часть II. Объектно-ориентированное программирование
 - •Глава 8
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 8. Преобразования типов
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 8. Преобразование типов
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 8. Преобразования типов
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 8. Преобразования типов
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 9
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 9. Рекомендации по программированию
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 9. Рекомендации по программированию
 - •Часть II. Объектно-ориентированное программирование
 - •Глава 9. Рекомендации по программированию
 - •250 Часть II. Объектно-ориентированное программирование
 - •Часть II. Объектно-ориентированное программирование
 - •254 Часть II. Объектно-ориентированное программирование
 - •Часть II. Объектно-ориентированное программирование
 - •Часть II. Объектно-ориентированное программирование
 - •Часть II. Объектно-ориентированное программирование
 - •Часть II. Объектно-ориентированное программирование
 - •Часть III
 - •Часть III. Стандартная библиотека
 - •Глава 10 Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Часть III. Стандартная библиотека
 - •Глава 10. Потоковые классы
 - •Глава 11
 - •Глава 11. Строки
 - •Часть III. Стандартная библиотека
 - •Глава 11. Строки
 - •Часть III. Стандартная библиотека
 - •Глава 11. Строки
 - •Часть III. Стандартная библиотека
 - •Глава 11. Строки
 - •Часть III. Стандартная библиотека
 - •Глава 12
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы 317
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Часть III. Стандартная библиотека
 - •Глава 12. Контейнерные классы
 - •Глава 13
 - •Глава 13. Итераторы и функциональные объекты
 - •Часть III. Стандартная библиотека
 - •Глава 13. Итераторы и функциональные объекты
 - •Часть III. Стандартная библиотека
 - •Глава 13. Итераторы и функциональные объекты
 - •Часть III. Стандартная библиотека
 - •Глава 13. Итераторы и функциональные объекты
 - •Часть III. Стандартная библиотека
 - •Глава 13. Итераторы и функциональные объекты
 - •Часть III. Стандартная библиотека
 - •Глава 13. Итераторы и функциональные объекты
 - •Часть III. Стандартная библиотека
 - •Глава 13. Итераторы и функциональные объекты
 - •Часть III. Стандартная библиотека
 - •Глава 14
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы 361
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 14. Алгоритмы
 - •Часть III. Стандартная библиотека
 - •Глава 15
 - •Часть III. Стандартная библиотека
 - •Глава 15. Средства для численных расчетов
 - •Часть III. Стандартная библиотека
 - •Глава 15. Средства для численных расчетов
 - •Часть III. Стандартная библиотека
 - •Глава 15. Средства для численных расчетов
 - •Часть III. Стандартная библиотека
 - •Глава 15. Средства для численных расчетов
 - •Глава 16
 - •Глава 16. Другие средства стандартной библиотеки
 - •Часть III. Стандартная библиотека
 - •396 Приложение 5. Константы, макросы и типы данных стандартной библиотеки
 - •Int level; // флаг состояния буфера
 - •Int bsize; // размер внутреннего буфера
 - •I0lbf 1 построчная буферизация текстового файла;
 - •400 Приложение 5. Константы, макросы и типы данных стандартной библиотеки
 - •402 Приложение 5. Константы, макросы и типы данных стандартной библиотеки
 - •404 Приложение 5. Константы, макросы и типы данных стандартной библиотеки
 - •406 Приложение 5. Константы, макросы и типы данных стандартной библиотеки
 - •446 Приложение 6. Функции стандартной библиотеки
 
Часть II. Объектно-ориентированное программирование
}
// Методы, изменяющие значения полей:
void thinkO:
// Прочие методы:
void draw(int x. int у, int scale, int position):
}:
// Реализация класса daemon
void daemon: :think(){ /* ... */ }
void daemon::draw(int x. int y, int scale, int position)
{ /* ... Отрисовка daemon */ }
В классе daemon введено поле brain и метод think, определены собственные конструкторы и операция присваивания, а также переопределен метод отрисовки draw. Все поля класса monstr, операции (кроме присваивания) и методы getjiealth, get_ammo и changejiealth наследуются в классе daemon, а деструктор формируется по умолчанию.
Рассмотрим правила наследования различных методов.
Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы. Порядок вызова конструкторов определяется приведенными ниже правилами.
□ Если в конструкторе производного класса явный вызов конструктора базово- , го класса отсутствует, автоматически вызывается конструктор базового клас са по умолчанию (то есть тот, который можно вызвать без параметров). Это использовано в первом из конструкторов класса daemon.
Для иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе, а затем исполняется конструктор класса.
В случае нескольких базовых классов их конструкторы вызываются в порядке объявления.
ВНИМАНИЕ
Если конструктор базового класса требует указания параметров, он должен быть явным образом вызван в конструкторе производного класса в списке инициализации (это продемонстрировано в трех последних конструкторах).
Не наследуется и операция присваивания, поэтому ее также требуется явно определить в классе daemon. Обратите внимание на запись функции-операции: в ее теле применен явный вызов функции-операции присваивания из базового класса. Чтобы лучше представить себе синтаксис вызова, ключевое слово operator вместе со знаком операции можно интерпретировать как имя функции-операции.
Вызов функций базового класса предпочтительнее копирования фрагментов кода из функций базового класса в функции производного. Кроме сокращения объема кода, этим достигается упрощение модификации программы: изменения требуется вносить только в одну точку программы, что сокращает количество возможных ошибок.
Глава 5. Наследование
205
Ниже перечислены правила наследования деструкторов.
Деструкторы не наследуются, и если программист не описал в производном классе деструктор, он формируется по умолчанию и вызывает деструкторы всех базовых классов.
В отличие от конструкторов, при написании деструктора производного класса в нем не требуется явно вызывать деструкторы базовых классов, поскольку это будет сделано автоматически.
Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в порядке, строго обратном вызову конструкторов: сначала вызывается деструктор класса, затем — деструкторы элементов класса, а потом деструктор базового класса.
Поля, унаследованные из класса monstr, недоступны функциям производного класса, поскольку они определены в базовом классе как private. Если функциям, определенным в daemon, требуется работать с этими полями, можно либо описать их в базовом классе как protected, либо обращаться к ним с помощью функций из monstr, либо явно переопределить их в daemon так, как было показано в предыдущем разделе (с. 201).
Рассматривая наследование методов, обратите внимание на то, что в классе daemon описан метод draw, переопределяющий метод с тем же именем в классе monstr (поскольку отрисовка различных персонажей, естественно, выполняется по-разному). Таким образом, производный класс может ие только дополнять, но и корректировать поведение базового класса1. Доступ к переопределенному методу базового класса для производного класса выполняется через имя, уточненное с помощью операции доступа к области видимости (::).
Виртуальные методы
Работа с объектами чаще всего производится через указатели. Указателю на базовый класс можно присвоить значение адреса объекта любого производного класса, например:
// Описывается указатель на базовый класс:
monstr *p;
// Указатель ссылается на объект производного класса:
р = new daemon; Вызов методов объекта происходит в соответствии с типом указателя, а не фактическим типом объекта, на который он ссылается, поэтому при выполнении оператора, например,
p->draw(l. 1. 1. 1):
будет вызван метод класса monstr, а не класса daemon, поскольку ссылки на методы разрешаются во время компоновки программы. Этот процесс называется ранним
1 Переопределять в производном классе рекомендуется только виртуальные методы (см. след. раздел).
206
