
- •Глава 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. Функции стандартной библиотеки
Глава 2. Модульное программирование
85
□ Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или использованием ссылки (например, int и const int или int и int&).
Шаблоны функций
Многие алгоритмы не зависят от типов данных, с которыми они работают (классический пример — сортировка). Естественно желание параметризовать алгоритм таким образом, чтобы его можно было использовать для различных типов данных. Первое, что может прийти в голову — передать информацию о типе в качестве параметра (например, одним параметром в функцию передается указатель на данные, а другим — длина элемента данных в байтах). Использование дополнительного параметра означает генерацию дополнительного кода, что снижает эффективность программы, особенно при рекурсивных вызовах и вызовах во внутренних циклах; кроме того, отсутствует возможность контроля типов. Другим решением будет написание для работы с различными типами данных нескольких перегруженных функций, но в таком случае в программе будет несколько одинаковых по логике функций, и для каждого нового типа придется вводить новую.
В C++ есть мощное средство параметризации — шаблоны. Существуют шаблоны функций и шаблоны классов (о шаблонах классов см. с. 211). С помощью шаблона функции можно определить алгоритм, который будет применяться к данным различных типов, а конкретный тип данных передается функции в виде параметра на этапе компиляции. Компилятор автоматически генерирует правильный код, соответствующий переданному типу. Таким образом, создается функция, которая автоматически перегружает сама себя и при этом не содержит накладных расходов, связанных с параметризацией.
Формат простейшей функции-шаблона:
template <class Type> заголовок{ /* тело функции */
Вместо слова Туре может использоваться произвольное имя.
В общем случае шаблон функции может содержать несколько параметров, каждый из которых может быть не только типом, но и просто переменной, например:
template <class A, class В, int i> void f(){ ... }
Например, функция, сортирующая методом выбора (он был рассмотрен на с. 59) массив из п элементов любого типа, в виде шаблона может выглядеть так:
template <class Type>
void sort_vybor(Type *b. int n){
Type а: //буферная переменная для обмена элементов
for (int i = 0; i<n-l; i++){ int imin = i;
for (int j = i + 1; j<n: j++) if (b[j] < b[imin]) imin = j;
86
Часть I. Структурное программирование
а - b[i]; b[i] = b[imin]; b[imin] = a; } } Главная функция программы, вызывающей эту функцию-шаблон, может иметь вид:
#include <iostream.h>
template <class Type> void sort_vybor(Type *b, int n);
int main(){
const int n = 20;
int i, b[n];
for (i = 0; i<n; i++) cin » b[i];
sort_yybor(b, n); // Сортировка целочисленного массива
for (i = 0; i<n; i++) cout « b[i] « ' ';
cout « endl;
double a[] = {0.22, 117, -0.08, 0.21, 42.5};
sortj/ybor(a. 5); // Сортировка массива вещественных чисел
for (i = 0; i<5; i++) cout « a[i] « ' ';
return 0; } Первый же вызов функции, который использует конкретный тип данных, приводит к созданию компилятором кода для соответствующей версии функции. Этот процесс называется инстанцированием шаблона (instantiation). Конкретный тип для инстанцирования либо определяется компилятором автоматически, исходя из типов параметров при вызове функции, либо задается явным образом. При повторном вызове с тем же типом данных код заново не генерируется. На месте параметра шаблона, являющегося не типом, а переменной, должно указываться константное выражение1.
Пример явного задания аргументов шаблона при вызове:
tempiate<class X, class Y, class Z> void f(Y. Z); void g(){
f<int. char*, double>("Vasia". 3.0); f<int. char*>("Vasia", 3.0);// Z определяется как double f<int>("Vasia". 3.0); // Y определяется как char*, a Z - как double // fCVasia". 3.0); ошибка; X определить невозможно
} Чтобы применить функцию-шаблон к типу данных, определенному пользователем (структуре или классу), требуется перегрузить операции для этого типа данных, используемые в функции (о перегрузке операций см. с. 189).
Как и обычные функции, шаблоны функций могут быть перегружены как с помощью шаблонов, так и обычными функциями.
Можно предусмотреть специальную обработку отдельных параметров и типов с помощью специализации шаблона функции. Допустим, мы хотим более эффективно
Подробнее о параметрах шаблонов рассказывается в разделе «Шаблоны классов», с. 211.