Глава 13. Обзор потоков ввода-вывода___________________________325

и будет использовать спецификаторы формата, которые будут дополнять выводимые числа до нужной ширины нулями. Она может быть такой:

void DATE::Print() (

// Альтернатива — члены класса ios — функции width и fill

cout.filll 'О');

cout.width( 2);

cout « day « "/";

cout.fill( '0');

cout.width( 2);

cout « month « "/" « year;

}

Перед вами встает проблема выбора из двух равно неудачных вариантов. Передавая на вывод базовые типы данных, вы используете объект cout, a для типа DATE вы вынуждены вызывать функцию Print. В то же время гораздо удобнее выводить все данные в поток одним и тем же путем:

int а = 5; » cout «a; // Вот так! DATE d(2, 12, 1996) ;

cout « d; //И только так!

Строгий и последовательный синтаксис лучше усваивается. Если вашим классам нужны возможности ввода-вывода, не поленитесь создать для них оператор-функции потоков.

Написание потоковых операций

Количество аргументов у операций потока ввода (operator») и вывода (operator«) одинаково; оба имеют характерный формат. Синтаксис обеих операций обычно выглядит так:

class X

(

public:

// ...

friend ostreams operator«( ostreams, X&) ;

friend istreams operator»( istreams, X&);

};

Теперь вам нужно только переписать эти несколько строк и держать их под рукой. А сейчас давайте выясним, что кроется за этими объявлениями и почему они выглядят именно так, как выглядят. Тому есть веские причины;

разберемся во всем не торопясь.

Потоковые операции в качестве дружественных функций. Спецификатор friend обеспечивает функциям доступ к закрытым элементам класса. Если функция является членом класса, то этот доступ у нее и так