我正在开发一个程序,通过高斯消元法求解矩阵形式的方程组。然而,我遇到了一个有趣的问题:如果我的算术运算符通过引用传递,行的规范化会给出不正确的结果。
在我的实现中,一个矩阵由多个 vector 组成,因此行运算只是 vector 运算。以下是相关函数:
vector :
T& operator[] (const int i);
const T& operator[] (const int i) const;
Vector<T>& operator/=(const T& rhs);
template<class T>
Vector<T>& Vector<T>::operator/=(const T& rhs)
{
if (rhs == 0)
{
throw DivideByZeroException();
}
for (int i = 0; i < _size; ++i)
{
_data[i] /= rhs;
}
return *this;
}
矩阵:
Vector<T>& operator[] (const int i);
const Vector<T>& operator[] (const int i) const;
(这样,单个[]用于访问一行,双[][]用于访问一个元素。)
现在这是导致问题的行:
mat[i] /= mat[i][i];
这里的问题是这个操作在某个点修改了mat[i][i]
,然后使用修改后的值,因为operator/=
使用引用传递.
问题:将运算符(和所有类似的运算符)更改为按值传递更好,还是只更改导致问题的行更好?是否假设所有运算符都将通过引用进行引用,从而使像上面这样的行通常很糟糕?
最佳答案
实际上我想我的评论是一个完整的答案,问题不是来自您的 /=
运算符的实现,而是来自调用者行本身。就像我说的,这不应该给出可预测的(合法的)结果。因为语言在标准中说得非常清楚,并给出了 i = i+++++i;
作为这一事实的示例行。
所以我的建议是不要试图让这件事成为你对客户的善意的特殊姿态,因为这样做的客户违反了比你的类(class)规范更重要的契约(Contract)。
关于c++ - 通过引用传递,源在操作中被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702978/