gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:18 27 4
gpt4 key购买 nike

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com