   •   Потоки ввода-вывода реализованы классами, производными от класса ios, 
объявления которых содержатся в заголовочном файле IOSTREAM.H. Реализованы 
четыре объекта потоков ввода-вывода — cin, cout, cerr и clog. В ios и 
производных от него классах определены операторы ввода («)   и вывода (») в 
потоке для всех встроенных типов данных C++. 
   •   Манипуляторы  потоков  ввода-вывода,  объявленные  в  заголовочных  файлах 
iomanip.h.  и  iostream.h, позволяют форматировать ввод и вывод в потоковых 
операторах ввода-вывода. Вы также можете написать свои собственные манипуляторы. 
   •   В классах могут перегружаться потоковые операторы ввода-вывода для 
обеспечения возможности записи к чтения объекта класса из потока. В программах 
затем можно будет использовать объекты этих классов = потоковых операторах ввода-вывода. 
    • Шаблоны предназначаются для создания функций и классов общего назначения, 
детали реализации которых обеспечиваются их пользователями. 
    •  Прочие средства C++, описанные в этой главе, включают в себя указатели на 
функции-члены, статические функции-члены, размещение объектов  по  заданным  
адресам,  непосредственный вызов  деструкторов, инициализацию членов объекта 
класса, вложенные объявления классов и применение опции fast this. 
   • Функция может возбуждать исключительную ситуацию, сигнализируя о 
возникновении исключительного условия. Обычно исключительные ситуации 
предназначены для сообщений об ошибках, но они могут иметь и другое 
применение. Для использования исключительных ситуаций на практике следует 
поместить функцию, возбуждающую исключительную ситуацию, в блок try за 
которым должны следовать один или несколько операторов catch. 
   •  Объекты   исключительных   ситуаций   могут   быть   произвольных   типов, 
например   целочисленными значениями, символьными строками или объектами классов. 
   •   Если в программе возникли необработанные исключительные ситуации, то по 
умолчанию вызывается функция unexpected(). Обычно функция unexpected() вызывает 
функцию terminate(), которая, в свою очередь, вызывает функцию abort() для 
аварийного завершения программы. Вы можете заменить функции unexpected()   и   
terminate() своими функциями-обработчиками   исключительных   ситуаций.   
Заменить функцию abort() нельзя. 
    •  С помощью нового оператора typeid можно получить динамическую информацию о 
типе любого объекта. Оператор возвращает объект класса Type_info, в котором 
описывается тип данных объекта. Вы также можете использовать оператор typeid для 
сравнения типов объектов. 

    Упражнения 

    15.1. Напишите код, моделирующий работу двигателя внутреннего сгорания. 
Придумайте два класса, один с именем TEngine (двигатель), другой с именем 
TFuel (горючее), в котором имеется закрытый вещественный член двойной точности 
level, показывающий сколько "горючего" залито в баки объекта класса. С помощью 
друзей объявите ваши классы так, чтобы класс TEngine имел непосредственный 
доступ к закрытому члену level класса TFuel. 
    15.2. Добавьте функции перегрузки операторов умножения (*) и деления (/) в 
класс TStrOp в листинге 15.5. 
    15.3. Добавьте функции перегрузки операторов ++ и -- в класс TStrOp в 
листинге 15.5. Реализуйте префиксные и постфиксные формы этих операторов. 
    15.4. Объявите и реализуйте оператор преобразования объекта класса TStrOp 
к типу double в листинге 15.5. 
    15.5. Дан класс с именем TFruit (фрукт) и объект orange (апельсин) типа 
TFruit, используйте orange для инициализации нового объекта с именем 
grapefruit (грейпфрут). 
    15.6. Напишите прототип для конструктора копирования гипотетического 
класса TFruit из упражнения 15.5. 
    15.7. Напишите перегруженный оператор присваивания для класса TFruit из 
упражнения 15.5.	
    15.8. Напишите программу, в которой используется шаблонная функция minO из 
листинга 15.10. 
    15.9. Создайте базу данных, из 100 случайных целочисленных значений с 
помощью шаблонного класса TDatabase из листинга 15.12. С помощью цикла for и 
оператора вывода в поток отобразите значения объектов в 8-символьных столбцах. 

    Часть III. Программирование на ANSI C++ 422
