我正在研究一种程序,通过高斯消元法求解矩阵形式的方程组.但是,我遇到了一个有趣的问题:如果我的算术运算符通过引用传递,则行的规范化会产生不正确的结果.
在我的实现中,Matrix由多个向量组成,因此行操作只是向量算术.以下是相关功能:
向量:
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;
(这样,单个[]用于访问行,double [] []用于访问元素.)
现在这是导致问题的那一行:
mat[i] /= mat[i][i];
这里的问题是这个操作在某个时刻修改mat [i] [i],然后使用修改后的值,因为operator / =使用pass by reference.
问题:更改运算符(和所有类似的运算符)以通过值传递或仅更改导致问题的行更好吗?是否假设所有操作符都将通过参考,一般情况下像上面这样的线路?
最佳答案 实际上我认为我将使我的评论成为一个完整的答案,问题不是来自你的/ =运算符的实现,而是来自调用者行的itsel.就像我说的那样,这不应该给出可预测的(合法的)结果.因为语言在标准中说得非常清楚,并给出了i = i i;作为这个事实的一个例子.
因此,我的建议是不要试图让这件事成为你对客户善意的特殊表现,因为这样做的客户违反了比你的班级规范更重要的合同.