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

UptoLike

Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
// обратной матрицы не существует
if(det == 0)
throw 2;
// обратная матрица – это транспонированная матрица
// алгебраических дополнений, поделенных на
// значение определителя исходной матрицы
int z;
for(int i = 0; i < n; i++)
{
z = i%2==0 ? 1 : -1;
for(int j = 0; j < n; j++)
{
Matrix temp = SubMatrix(i, j);
res.a[j][i] = z * temp.Determinant() / det;
z = -z;
}
}
return res;
}
Операторная функция не должна содержать дополнительных
параметров, кроме тех, которые определяют ее операнды. Поэтому, в
случае возникновения ошибки при выполнении операции, сообщение о
ней не может быть передано через параметры или возвращаемое
значение. Для обработки таких ситуаций удобно использовать генерацию
исключений, что было продемонстрировано в примерах: в операции
умножения матриц при некорректных размерах и в операции вычисления
обратной матрицы в случаях, когда исходная матрица не является
квадратной или когда определитель матрицы равен нулю.
Если разрабатывается класс, в котором происходит выделение и
освобождение памяти, то в дополнение к конструкторам и деструктору
класса требуется перегрузить операцию присваивания (операция "=").
Если она не перегружена, то при ее выполнении происходит
поэлементное копирование значений из объекта, стоящего справа от
символа "=", в объект, стоящий слева. Таким образом, два или более
объектов будут ссылаться на одну и ту же область памяти. Поэтому при
уничтожении одного из этих объектов другими пользоваться будет
нельзя. В перегруженной версии необходимо освобождать память в
объекте левом операнде, в нем же выделять память, необходимую для
хранения данных правого операнда, и произвести копирование данных
правого операнда в левый. Приведем реализацию перегруженного
оператора присваивания для класса Matrix:
84
                              Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
          // обратной матрицы не существует
          if(det == 0)
               throw 2;
          // обратная матрица – это транспонированная матрица
          // алгебраических дополнений, поделенных на
          // значение определителя исходной матрицы
          int z;
          for(int i = 0; i < n; i++)
          {
               z = i%2==0 ? 1 : -1;
               for(int j = 0; j < n; j++)
               {
                    Matrix temp = SubMatrix(i, j);
                    res.a[j][i] = z * temp.Determinant() / det;
                    z = -z;
               }
          }
          return res;
     }

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


84