Глава 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 обеспечивает функциям доступ к закрытым элементам класса. Если функция является членом класса, то этот доступ у нее и так