Основы программирования

Потоки в C++ - Вывод
Индекс материала
Потоки в C++
Вывод
Некоторые Подробности Разработки
Форматированный Вывод
Виртуальная Функция Вывода
Инициализация Потоков Вывода
Состояния Потока
Инициализация Потоков Ввода
Буферизация
Упражнения
Все страницы


8.2 Вывод

Вывод Встроенных Типов

Класс ostream определяется вместе с операцией «„ («поместить в“) для обработки вывода встроенных типов:

class ostream (* // ... public: ostream amp; operator««(char*); ostream amp; operator««(int i) (* return *this««long(i); *) ostream amp; operator««(long); ostream amp; operator««(double);

ostream amp; put(char); *);

Функция operator«« возвращает ссылку на ostream, для которого она была вызвана, чтобы к ней можно было применять другой ostream. Например:

cerr «« "x = " «« x;

где x является int, будет интерпретироваться как:

(cerr.operator««("x = ")).operator««(x);

В частности, отсюда следует, что когда один оператор ввода печатает несколько элементов, они будут печататься в ожидаемом порядке: слева направо. Наличие operator««, которая получает int, является избыточным, поскольку int может неявно преобразовываться в long. С другой стороны, int может преобразовываться также и в double. Наличие ostream::operator««(int) позволяет избежать этой неоднозначности. Для печати символов в виде символов предоставляется функция ostream::put(char), а ostream::operator««(int) печатает их целые значения.



8.2.2 Вывод Определяемых Пользователем Типов

Рассмотрим определяемый пользователем тип:

class complex (* double re, im; public: complex(double r = 0, double i = 0) (* re=r; im=i; *)

friend double real(complex amp; a) (* returna.re; *) friend double real(complex amp; a) (* returna.re; *)

friend complex operator+(complex, complex); friend complex operator-(complex, complex); friend complex operator*(complex, complex); friend complex operator/(complex, complex); // ... *);

Операцию «« для нового типа complex можно определить так:

ostream amp; operator««(ostream amp;s, complex z) (* return s «« "(" «« real(z) «« "," «« imag(z) «« ")"; *)

и использовать точно так же, как для встроенного типа:

complex x(1,2); // ... cout «„ "x = " «« x «« «\n“;

получая при этом

x = (1,2)

Определение действия вывода для определяемого пользователем типа не требует ни модификации описания класса ostream, ни доступа к структуре данных (скрытой), которую этот класс поддерживает. Очень удачно, что имеет место первое, потому что описание класса ostream находится в стандартных заголовочных файлах, к которым у обычного пользователя нет доступа на запись. Последнее также важно, потому что обеспечивает защиту от случайной порчи структуры данных. Это также позволяет менять реализацию ostream не влияя на пользовательские программы.