
- •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. Повторная генерация исключений
Глава 12
Функции и целые классы могут быть объявлены друзьями не шаблонных классов. Для шаблонов классов также могут быть установлены отношения дружественности. Дружественность может быть установлена между шаблоном класса и глобальной функцией, функцией-элементом другого класса (возможно, шаблонного класса) или даже целым классом (возможно, шаблонным классом).
Каждый шаблонный класс, полученный из шаблона класса, имеет собственную копию каждого статического элемента данных шаблона; все экземпляры этого шаблонного класса используют свой статический элемент данных. Как и статические элементы данных не шаблонного класса, статические элементы данных шаблонных классов должны быть инициализированы в области действия файл.
Каждый шаблонный класс получает собственную копию статической функции-элемента шаблона класса.
Терминология
template<class T>
аргумент шаблона друзья шаблона имя шаблона имя шаблона класса ключевое слово class
в шаблонном параметре типа ключевое слово template нетиповой параметр заголовка
шаблона
объявление шаблона функции описание шаблона функции параметр типа в заголовке шаблона параметр шаблона параметризованный тип перегрузка шаблонной функции
статическая функция-член
шаблона класса статическая функция-член
шаблонного класса угловые скобки (< и >) формальный параметр
заголовка шаблона функция-член шаблонного класса член данных static шаблона класса член данных static шаблонного
класса
шаблон класса шаблон функции шаблонная функция шаблонный класс
Типичные ошибки программирования
Ошибкой является отсутствие в шаблоне ключевого слова class перед каждым формальным параметром типа.
Ошибка возникает, когда в списке параметров функции использу ются не все формальные параметры шаблона функции.
Если шаблон вызывается с определяемым пользователем типом в качестве параметра и если этот шаблон использует операции (на пример, ==, +, <= и др.) с объектами этого типа, то такие операции должны быть перегружены! Если эти операции остались не пере груженными, то при редактировании связей будет выдано сообщение об ошибке, потому что компилятор, конечно, сгенерирует вызов со ответствующих перегруженных функций-операций, не обращая вни мание на то, что эти функции не определены.
Компилятор подбирает вариант функции, соответствующий данному вызову. Если соответствующая функция не может быть найдена или
Шаблоны 699
если обнаружено несколько таких функций, то компилятор генерирует сообщение об ошибке.
12.5. В отличие от не шаблонных классов, которые могут быть вложенными, шаблоны классов не могут вкладываться друг в друга. Попытка вложить один шаблон класса внутрь другого приводит к синтаксической ошибке.
Советы по повышению эффективности
Шаблоны несомненно расширяют возможности многократного ис пользования программного кода. Но имейте в виду, что программа может создавать слишком много копий шаблонных функций и шаб лонных классов. Для этих копий могут потребоваться значительные ресурсы памяти.
Если размер класса контейнера, например, массива или стека, может быть определен во время компиляции (например, при помощи нетипо вого параметра шаблона, указывающего размер), это устранит расходы на динамическое выделение памяти во время выполнения программы.
Замечания по технике программирования
Шаблоны являются еще одной из многочисленных возможностей С++ по созданию более универсального программного обеспечения, которое можно использовать повторно.
Шаблоны функций, как и макросы, позволяют создавать программ ное обеспечение, которое можно использовать повторно. Но в отли чие от макросов шаблоны функций в С++ позволяют полностью контролировать соответствие типов.
Применение шаблонов классов увеличивает возможности повторного использования программного обеспечения, когда классы для конкрет ного типа данных могут создаваться на основе родовой версии класса.
Определение размера класса контейнера во время компиляции (на пример, через нетиповой параметр шаблона) исключает возможность возникновения потенциально неисправимой ошибки во время вы полнения программы, если оператору new не удастся получить не обходимое количество памяти.
Упражнения для самопроверки
12.1. Определите, являются ли следующие утверждения истинными или ложными. Если утверждение ложно, объясните почему.
Дружественная функция шаблона функции должна быть шаб лонной функцией.
Если несколько шаблонных классов произведены от одного и того же шаблона класса с единственным статическим элементом данных, то каждый из шаблонных классов совместно использует одну копию этого статического элемента данных.