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