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

UptoLike

Объектно-ориентированное программирование на С++
// операция присваивания матриц
Matrix& Matrix::operator = (Matrix& ob)
{
if(n != ob.n || m != ob.m)
{
// освобождение памяти в левом операнде
for(int i = 0; i < m; i++)
delete [] a[i];
delete [] a;
// выделение памяти в левом операнде
n = ob.n;
m = ob.m;
a = new double* [m];
for(int i = 0; i < m; i++)
a[i] = new double [n];
}
// копирование данных правого операнда в левый
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
a[i][j] = ob.a[i][j];
return *this;
}
Результатом оператора присваивания является левый операнд. При
такой реализации возможно следующее его использование:
. . .
Matrix a(2,2), b(2,2), c(2,2);
a.InputMatrix();
c = b = a;
c.OutputMatrix();
. . .
В данном случае матрицы b и c будут содержать те же данные, что и
матрица а.
Отметим, что оператор присваивания по своей реализации
аналогичен конструктору копирования. Отличие состоит в том, что
конструктор копирования выполняется в момент создания объекта-копии,
а оператор присваивания используется для существующих объектов.
Перегрузка операций ввода/вывода.
В С++ ввод и вывод выполняется с помощью специальных операций
потокового ввода/вывода, использование которых мы рассматривали в
разделе 1.1. Эти же операции можно использовать и для организации
ввода/вывода объектов пользовательских типов данных. Это
осуществляется с помощью их перегрузки.
85
                            Объектно-ориентированное программирование на С++
     // операция присваивания матриц
     Matrix& Matrix::operator = (Matrix& ob)
     {
          if(n != ob.n || m != ob.m)
          {
                // освобождение памяти в левом операнде
                for(int i = 0; i < m; i++)
                     delete [] a[i];
                delete [] a;
                // выделение памяти в левом операнде
                n = ob.n;
                m = ob.m;
                a = new double* [m];
                for(int i = 0; i < m; i++)
                     a[i] = new double [n];
          }
          // копирование данных правого операнда в левый
          for(int i = 0; i < m; i++)
                for(int j = 0; j < n; j++)
                     a[i][j] = ob.a[i][j];
          return *this;
     }

    Результатом оператора присваивания является левый операнд. При
такой реализации возможно следующее его использование:

     .    .    .
     Matrix a(2,2), b(2,2), c(2,2);
     a.InputMatrix();
     c = b = a;
     c.OutputMatrix();
     .    .    .

     В данном случае матрицы b и c будут содержать те же данные, что и
матрица а.
     Отметим, что оператор присваивания по своей реализации
аналогичен конструктору копирования. Отличие состоит в том, что
конструктор копирования выполняется в момент создания объекта-копии,
а оператор присваивания используется для существующих объектов.
     Перегрузка операций ввода/вывода.
     В С++ ввод и вывод выполняется с помощью специальных операций
потокового ввода/вывода, использование которых мы рассматривали в
разделе 1.1. Эти же операции можно использовать и для организации
ввода/вывода объектов пользовательских типов данных. Это
осуществляется с помощью их перегрузки.
                                                                          85