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

UptoLike

Объектно-ориентированное программирование на С++
Однако значительно удобнее использовать более естественное
обращение к операции:
. . .
Matrix a(2,3), b(3,4);
a.InputMatrix();
b.InputMatrix();
Matrix c = a * b;
. . .
Для умножения матрицы на число должна быть перегружена
операция "*", она также будет бинарной, но будет отличаться типом
второго операнда:
// операция умножения матрицы на число
Matrix Matrix::operator * (double b)
{
Matrix temp(m, n);
// заполнение матрицы-результата
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
temp.a[i][j] = a[i][j] * b;
return temp;
}
Если при обращении к операции умножения второй операнд будет
являться числовой константой или переменной числового типа, будет
вызываться последняя реализация перегруженной операции.
. . .
Matrix a(2,3);
a.InputMatrix();
Matrix c = a * 5; // эквивалентное обращение
// Matrix c = a.operator*(5);
. . .
Однако обращение к операции умножения в случае, когда число
является первым операндом, пока невозможно. Поэтому имеет смысл
перегрузить операцию "*" для случая, когда первый операнд является
числом, а второй матрицей. Но для этого нельзя использовать
операторную функцию, которая является методом класса, поскольку для
нее первым операндом обязательно должен быть объект класса.
В таких случаях перегрузка операций осуществляется с помощью
внешних по отношению к классу функций. Такая функция не является
81
                          Объектно-ориентированное программирование на С++
    Однако значительно удобнее использовать более естественное
обращение к операции:

    .    .    .
    Matrix a(2,3), b(3,4);
    a.InputMatrix();
    b.InputMatrix();
    Matrix c = a * b;
    .    .    .

    Для умножения матрицы на число должна быть перегружена
операция "*", она также будет бинарной, но будет отличаться типом
второго операнда:

    // операция умножения матрицы на число
    Matrix Matrix::operator * (double b)
    {
         Matrix temp(m, n);
         // заполнение матрицы-результата
         for(int i = 0; i < m; i++)
              for(int j = 0; j < n; j++)
                   temp.a[i][j] = a[i][j] * b;
         return temp;
    }

    Если при обращении к операции умножения второй операнд будет
являться числовой константой или переменной числового типа, будет
вызываться последняя реализация перегруженной операции.
    .    .    .
    Matrix a(2,3);
    a.InputMatrix();
    Matrix c = a * 5;   // эквивалентное обращение
                        // Matrix c = a.operator*(5);
    .    .    .

     Однако обращение к операции умножения в случае, когда число
является первым операндом, пока невозможно. Поэтому имеет смысл
перегрузить операцию "*" для случая, когда первый операнд является
числом, а второй – матрицей. Но для этого нельзя использовать
операторную функцию, которая является методом класса, поскольку для
нее первым операндом обязательно должен быть объект класса.
     В таких случаях перегрузка операций осуществляется с помощью
внешних по отношению к классу функций. Такая функция не является
                                                                        81