
- •618 Глава 10
- •620 Глава 10
- •Глава 10
- •624 Глава 10
- •626 Глава 10
- •630 Глава 11 План
- •11.3. Вывод потоков
- •11.4. Ввод потоков
- •11.7. Состояния формата потоков
- •11.10. Связывание выходного потока с входным
- •11.1. Введение
- •632 Глава 11
- •11.2. Потоки
- •11.2.1. Заголовочные файлы библиотеки iostream
- •11.2.2. Классы и объекты потоков ввода-вывода
- •634 Глава 11
- •11.3. Вывод потоков
- •11.3.1. Операция поместить в поток
- •636 _ Глава 11
- •47 Плюс 53 равняется 100
- •11.3.2. Сцепление операций поместить в поток и взять из потока
- •47 Плюс 53 равняется 100
- •638 _ Глава 11
- •11.3.3. Вывод переменных типа char *
- •11.3.4. Вывод символов с помощью функции-элемента put; сцепленные выводы
- •11.4. Ввод потоков
- •11.4.1. Операция взять из потока
- •640 _ Глава 11
- •7 Не равно 5
- •8 Равно 8
- •11.4.2. Функции-элементы get и getline
- •642 Глава 11
- •644 Глава 11
- •11.4.3. Другие функции-элементы класса istream (peek, putback, ignore)
- •11.4.4. Сохранение типов данных при вводе-выводе
- •11.5. Неформатированный ввод-вывод с использованием read, gcount и write
- •11.6. Манипуляторы потоков
- •646 _ Глава 11
- •11.6.1. Манипуляторы потоков dec, oct, hex и setbase, задающие основание чисел
- •11.6.2. Точность чисел с плавающей запятой (precision,
- •11.6.3. Ширина поля (setw, width)
- •648 Глава 11
- •650 Глава 11
- •11.6.4. Манипуляторы, определяемые пользователем
- •11.7. Состояния формата потоков
- •11.7.1. Флаги состояний формата
- •Глава 11
- •11.7.2. Нулевые младшие разряды и десятичные точки
- •11.7.3. Выравнивание (ios::left, ios::right, ios::internal)
- •654 Глава 11
- •11.7.4. Заполнение (fill, setfill)
- •10000 Напечатанное как целое с выравниванием right и left и как шестнадцатеричное с выравниванием internal Использование заполняющего символа по умолчанию (пробела)
- •656 Глава 11
- •11.7.5. Основание системы счисления (ios::dec, ios::oct, ios::hex,
- •11.7.6. Числа с плавающей запятой; экспоненциальный формат (ios::scientific, ios::fixed)
- •658 Глава 11
- •11.7.7. Управление выводом в нижнем и верхнем регистрах
- •11.7.8. Установка и сброс флагов формата (flags, setiosflags
- •11.8. Состояния ошибок потока
- •11.9. Ввод-вывод определенных пользователем типов данных
- •Глава 11
- •После cin.Clear():
- •664 Глава 11
- •11.10. Связывание выходного потока с входным
- •Глава 11
- •Глава 11
- •670 Глава 11
- •672 Глава 11
- •674 Глава 11
- •676 Глава 11
- •1) Неверно. Поток cin связан со стандартным устройством ввода компьютера, обычно с клавиатурой.
- •0) Верно.
- •678 Глава 11
- •680 Глава 11
- •684 Глава 12
- •12.2. Шаблоны функций
- •686 Глава 12
- •Глава 12
- •12.3. Перегрузка шаблонных функций
- •12.4. Шаблоны классов
- •Глава 12
- •692 Глава 12
- •694 Глава 12
- •12.5. Шаблоны классов и нетиповые параметры
- •12.6. Шаблоны и наследование
- •12.7. Шаблоны и друзья
- •696 Глава 12
- •12.8. Шаблоны и статические элементы
- •Глава 12
- •700 Глава 12
- •702 Глава 12
- •704 Глава 13 План
- •13.1. Введение
- •706 Глава 13
- •708 Глава 13
- •13.2. Когда должна использоваться обработка исключений
- •13.3. Другие методы обработки ошибок
- •710 Глава 13
- •13.5. Простой пример обработки исключений: деление на нуль
- •712 Глава 13
- •13.6. Блоки try
- •13.7. Генерация исключений
- •714 Глава 13
- •13.8. Перехват исключений
- •716 Глава 13
- •718 Глава 13
- •13.9. Повторная генерация исключений
686 Глава 12
Все описания шаблонов функций начинаются с ключевого слова template, за которым следует список формальных параметров шаблона, заключаемый в угловые скобки (< и >); каждому формальному параметру должно предшествовать ключевое слово class, как в следующих примерах:
template <class T>
ИЛИ
template <class ElementType>
или
template <class BorderType, class FillType>
Формальные параметры в описании шаблона используются (наряду с параметрами встроенных типов или типов, определяемых пользователем) для определения типов параметров функции, типа возвращаемого функцией значения и типов переменных, объявляемых внутри функции. Далее, за этим заголовком, следует обычное описание функции. Заметьте, что ключевое слово class, используемое в шаблоне функции при задании типов параметров, фактически означает «любой встроенный тип или тип, определяемый пользователем».
Типичная ошибка программирования 12.1
Ошибкой является отсутствие в шаблоне ключевого слова class перед каждым формальным параметром типа.
Давайте рассмотрим в качестве примера шаблон функции printArray, приведенный на рис. 12.1. Этот шаблон используется в программе, приведенной на рис. 12.2.
В шаблоне функции printArray объявляется один формальный параметр Т (вместо идентификатора Т может быть использован любой другой допустимый идентификатор) для типа массива, который будет выводиться функцией printArray;
template<class T>
void printArray(T *array, const int count)
{
for (int i = 0; i < count; i++) cout « array[i] « " ";
cout « endl;
Рис. 12.1. Шаблон функции
Т называется параметром типа. Когда компилятор обнаруживает в тексте программы вызов функции printArray, он заменяет Т во всей области определения шаблона на тип первого параметра функции printArray и С++ создает шаблонную функцию вывода массива указанного типа данных. После этого вновь созданная функция компилируется. В программе, приведенной на рис. 12.2, производится вызов трех функций printArray: одна выводит
Шаблоны _ 687
массив типа int, другая выводит массив чисел с плавающей запятой и третья обрабатывает массив символов. Например, реализация функции для типа int будет выглядеть следующим образом:
void printArray(int *array, const int count) {
for (int i = 0; i < count; i++) cout « array[i] « " ";
cout « endl;
Каждый формальный параметр из описания шаблона функции должен появиться в списке параметров функции по крайней мере один раз. Имя формального параметра может использоваться в списке параметров заголовка шаблона только один раз. Одно и то же имя формального параметра шаблона функции может использоваться несколькими шаблонами.
Типичная ошибка программирования 12.2
Ошибка возникает, когда в списке параметров функции используются не все формальные параметры шаблона функции.
На рис. 12.2 приведена программа, использующая шаблон функции prin-tArray. Программа начинается с определения массива а типа int, массива b типа float и массива с типа char с размерами соответственно 5, 7 и 6. Затем каждый из массивов выводится на экран при помощи вызова функции prin-tArray: один раз с первым аргументом равным а типа int *, затем с аргументом b типа float * и в третьем вызове в качестве первого аргумента используется массив с типа char *. В результате вызова
printArray (а, aCount);
компилятор создает шаблонную функцию printArray, в которой вместо параметра типа Т используется тип int. Вызов функции
printArray (b, bCount);
приводит к созданию второй шаблонной функции printArray, в которой параметр типа Т заменяется на тип float. При обработке вызова функции
printArray (с, cCount);
компилятор создает третью шаблонную функцию printArray, для которой параметр типа Т заменяется на тип char.
Совет по повышению эффективности 12.1
Шаблоны несомненно расширяют возможности многократного использования программного кода. Но имейте в виду, что программа может создавать слишком много копий шаблонных функций и шаблонных классов. Для этих копий могут потребоваться значительные ресурсы памяти.
688