324 _____ _____________Часть II. Программирование на C++
Функции потоковых операций
Операции для потоков ввода-вывода считывают или записывают данные в потоки данных. Вы спросите — что же они считывают и записывают? Ответим: все, что угодно.
Чаще всего на них возлагается обязанность пересылки некоторого форматированного набора данных для инициализации объекта или для вывода его содержимого. Проще всего это сделать путем использования данных — элементов классов.
Рассмотрим класс DATE. В нем содержится три беззнаковых целых, представляющих день, месяц и год. Зададимся вопросом: как нам следует записать дату в поток вывода (например, на консоль)? Одним из вариантов может быть вывод даты в виде строки, составленной из дня, месяца и года, в формате dd/mm/yyyy.
Хотелось бы, применив операцию « к произвольной переменной типа DATE, получить на экране что-нибудь в этом роде:
*
DATE d( 2, 12, 1996); // Получает З беззнаковых целых cout « d; // Выводит "02/12/1996"
Не существует языков, которые могли бы делать такие вещи совершенно без участия программиста, и C++ не исключение. Однако код, который вам придется написать, можно так привязать к операции «, что синтаксис печати даты не будет ничем отличаться от синтаксиса вывода любого простого встроенного типа.
В этом примере мы решили, что "напечатать дату" должно означать вывести три составляющие даты в определенном формате. Тому есть веские основания. C++ не решит за вас, что должна будет делать операция потока вывода. Программирование субъективно; стало быть, решать придется вам. C++ обеспечивает вас возможностью расширять грамматику языка в соответствии с вашими потребностями, но не заставляет делать это и не навязывает своих представлений о ней.
Замечание
Вернемся еще раз к классу DATE. Печать даты можно реализовать несколькими способами. Например, можно создать функцию-член Print, которая будет печатать значения элементов day, month и year (день, месяц и год):
DATE d( 2, 12, 1996) ;
d.Print(); // Выводит "02/12/1996"
!
Эта функция может выглядеть так:
void DATE::Print() {
printff "%0.2d/%0..2d/%4d", day, month, year) ;
}