Объектно-ориентированное программирование на C++. Андрианова А.А - 86 стр.

UptoLike

Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
Операции ввода/вывода нельзя определить как методы класса из-за
того, что первым операндом этой операции должен быть объект входного
или выходного потока. Таким образом, перегрузка этих операций
осуществляется с помощью дружественных функций.
Определим для класса Matrix ввод/вывод:
class Matrix
{
. . .
friend istream& operator >> (istream&, Matrix&);
friend ostream& operator << (ostream&, Matrix);
. . .
};
// перегруженная операция ввода матрицы
istream& operator >> (istream& in, Matrix& ob)
{
if(ob.a != NULL)
{
for(int i = 0; i < ob.m; i++)
for(int j = 0;j < ob.n; j++)
in >> ob.a[i][j];
}
return in;
}
// перегруженная операция вывода матрицы
ostream& operator << (ostream& out, Matrix ob)
{
if(ob.a != NULL)
{
out << "Матрица:" << endl;
for(int i = 0; i < ob.m; i++)
{
for(int j = 0; j < ob.n; j++)
out << ob.a[i][j] << "\t";
out << endl;
}
}
else
out << "Матрица пуста" << endl;
return out;
}
Первым параметром операций ввода/вывода является ссылка на
поток ввода или вывода. В функции ввода второй параметр должен
передаваться по ссылке, поскольку в нем сохраняются вводимые данные.
86
                              Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
     Операции ввода/вывода нельзя определить как методы класса из-за
того, что первым операндом этой операции должен быть объект входного
или выходного потока. Таким образом, перегрузка этих операций
осуществляется с помощью дружественных функций.
     Определим для класса Matrix ввод/вывод:

     class Matrix
     {
          .    .    .
          friend istream& operator >> (istream&, Matrix&);
          friend ostream& operator << (ostream&, Matrix);
          .    .    .
     };

     // перегруженная операция ввода матрицы
     istream& operator >> (istream& in, Matrix& ob)
     {
          if(ob.a != NULL)
          {
               for(int i = 0; i < ob.m; i++)
                    for(int j = 0;j < ob.n; j++)
                         in >> ob.a[i][j];
          }
          return in;
     }

     // перегруженная операция вывода матрицы
     ostream& operator << (ostream& out, Matrix ob)
     {
          if(ob.a != NULL)
          {
               out << "Матрица:" << endl;
          for(int i = 0; i < ob.m; i++)
          {
               for(int j = 0; j < ob.n; j++)
                    out << ob.a[i][j] << "\t";
               out << endl;
          }
          }
          else
               out << "Матрица пуста" << endl;
          return out;
     }

    Первым параметром операций ввода/вывода является ссылка на
поток ввода или вывода. В функции ввода второй параметр должен
передаваться по ссылке, поскольку в нем сохраняются вводимые данные.

86