c++ - 通过引用传递,源在操作中被修改

标签 c++ matrix reference

我正在开发一个程序,通过高斯消元法求解矩阵形式的方程组。然而,我遇到了一个有趣的问题:如果我的算术运算符通过引用传递,行的规范化会给出不正确的结果。

在我的实现中,一个矩阵由多个 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/

相关文章:

forms - 如何在 Microsoft Access 的表达式中引用当前表单?

c++ - 在c++中使用x86 DIV的asm block 有什么用?

python - 从矩阵列表中删除重复矩阵

c# - 从列表中删除项目以及对它们的所有引用

c - 在C中按行对由数据结构组成的矩阵进行排序

r - 如何将GPU(gpuR)矩阵转换为标准R矩阵?

reporting-services - 为什么在 "Add Reference..."对话框中看不到 Microsoft.ReportViewer.WebForms 版本 10.0.0.0?

c++ - 不可变的 C++ 容器类

c++ - 如何使用 irrlicht 获取鼠标位置?

C++/CLI 应用程序无法启动