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

UptoLike

Объектно-ориентированное программирование на С++
Когда операндами являются объекты разных классов (например,
перемножение вектора и матрицы), то можно реализовать перегрузку
одним из двух способов:
создать внешнюю функцию и сделать ее дружественной для
обоих классов (функция будет иметь два параметра);
перегрузить функцию в классе первого операнда, а во втором
классе объявить ее дружественной. В этом случае функция
будет иметь один параметр – второй операнд операции.
Перегрузка унарных операций аналогична перегрузке бинарных
операций за исключением того, что она происходит не с двумя, а с одним
операндом. В связи с этим при перегрузке унарной операции в классе этот
метод не имеет параметров. Объект, вызывающий операцию, будет
являться ее единственным операндом.
В качестве примера перегрузим операции "!" и "~" для класса
Matrix. Операция "!" будет выполнять транспонирование матрицы, а
операция "~" – получение обратной матрицы.
// перегрузка операции "!" - транспонирование матрицы
Matrix Matrix::operator !()
{
Matrix temp(n, m);
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
temp.a[j][i] = a[i][j];
return temp;
}
Для вычисления обратной матрицы предполагаем, что в классе
Matrix разработаны методы вычисления определителя квадратной
матрицы Determinant() и получения ее подматрицы, путем удаления
заданных строки и столбца SubMatrix().
// перегрузка операции "~" - получение обратной матрицы
Matrix Matrix::operator ~()
{
// если матрица неквадратная, то обратной матрицы
// не существует
if(n != m)
throw 1;
Matrix res(n, n);
// вычисление определителя матрицы
double det = Determinant();
// если определитель матрицы равен 0,
83
                            Объектно-ориентированное программирование на С++
    Когда операндами являются объекты разных классов (например,
перемножение вектора и матрицы), то можно реализовать перегрузку
одним из двух способов:
        • создать внешнюю функцию и сделать ее дружественной для
           обоих классов (функция будет иметь два параметра);
        • перегрузить функцию в классе первого операнда, а во втором
           классе объявить ее дружественной. В этом случае функция
           будет иметь один параметр – второй операнд операции.
    Перегрузка унарных операций аналогична перегрузке бинарных
операций за исключением того, что она происходит не с двумя, а с одним
операндом. В связи с этим при перегрузке унарной операции в классе этот
метод не имеет параметров. Объект, вызывающий операцию, будет
являться ее единственным операндом.
    В качестве примера перегрузим операции "!" и "~" для класса
Matrix. Операция "!" будет выполнять транспонирование матрицы, а
операция "~" – получение обратной матрицы.

     // перегрузка операции "!" - транспонирование матрицы
     Matrix Matrix::operator !()
     {
          Matrix temp(n, m);
          for(int i = 0; i < m; i++)
               for(int j = 0; j < n; j++)
                    temp.a[j][i] = a[i][j];
          return temp;
     }

    Для вычисления обратной матрицы предполагаем, что в классе
Matrix разработаны методы вычисления определителя квадратной
матрицы Determinant() и получения ее подматрицы, путем удаления
заданных строки и столбца SubMatrix().
     // перегрузка операции "~" - получение обратной матрицы
     Matrix Matrix::operator ~()
     {
          // если матрица неквадратная, то обратной матрицы
          // не существует
          if(n != m)
               throw 1;
          Matrix res(n, n);
          // вычисление определителя матрицы
          double det = Determinant();
          // если определитель матрицы равен 0,
                                                                          83