13.3  Ввод-вывод типов, определенных пользователем

В файле <iostream.h> перегружены операции ввода >> и вывода << для встроенных типов, но C++ – язык, позволяющий пользователю оп­ределять новые типы, столь же эффективные и удобные, как и встроенные типы. Обработка встроенных типов и типов, определенных пользователем, достигается с помощью пере­грузки операций.

Пусть создан класс myclass с переменными х, y и двумя дружественными функциями:

class myclass

{

float x,y;

friend ostream &operator<<(ostream &, myclass &);

friend istream &operator>>(istream &, myclass &);

};

ostream &operator<<(ostream &fo, myclass &w)

{

fo << "x = " << w.x << ";" << "y = " << w.y << endl;

return fo;

}

istream &operator>>(istream &fi, myclass &w)

{

cout << "Input x:t =";

fi >> w.x;

cout << "Input y:t =";

fi >> w.y;

return fi;

}

Тогда использовать операции ввода (>>)  и вывода (<<) можно и для класса пользователя. Например:

myclass d;

cin>>d;

cout << "d = " << d<<endl;

Можно сцепить новую пользовательскую операцию вывода (<<)  в цепочку с уже существующими операциями вывода, потому что функция-операция возвращает ссылку на объект класса ostream. Функция обязательно должна быть объявлена как дружественная классу myclass, а не как его член, потому что в операции вывода слева стоит объект другого класса. Член-функция, как мы знаем, первым аргументом всегда неявно получает указатель this, а операция вывода (<<) должна получить ссылку (&) на класс ostream.

Ввод пользовательского типа определяется точно так же, как вывод. Единственное отличие состоит в том, что для операции вво­да важно, чтобы второй параметр был ссылкой.