通过引用传递,在操作中间修改源

时间:2014-03-28 02:19:00

标签: c++ matrix reference

我正在研究一种通过高斯消元法求解矩阵形式的方程组的程序。但是,我遇到了一个有趣的问题:如果我的算术运算符通过引用传递,则行的规范化会产生不正确的结果。

在我的实现中,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/=使用传递引用。

问题 :更改运算符(和所有类似的运算符)以传递值或更改导致问题的行更好吗?是否假设所有操作符都是通过引用,通常会使上面的行变得如此糟糕?

1 个答案:

答案 0 :(得分:2)

实际上,我认为我要将我的评论作为一个完整的答案,问题不在于您的/=运算符的实现,而在于调用者线上的问题。就像我说的那样,这不应该给出可预测的(合法的)结果。因为语言在标准中说得非常清楚,并以i = i++ + ++i;为例说明了这一事实。

所以我的建议是不要试图让这件事成为你对客户善意的特殊表现,因为这样做的客户违反了比你的班级规范更重要的合同。