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) ;

}