ВУЗ:
Составители:
Рубрика:
Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
// обратной матрицы не существует
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
Страницы
- « первая
- ‹ предыдущая
- …
- 82
- 83
- 84
- 85
- 86
- …
- следующая ›
- последняя »
