运算符重载使用*和*=作为点积或叉积。

3

我正在创建一个用于基本向量操作的向量类,并尝试决定哪个[点积或叉积]最适合重载**=运算符,希望得到其他人的意见。

到目前为止,我已经实现了++=--=运算符。

template<typename T>
Vector<T> Vector<T>::operator+(const Vector<T>& rhs) {
    Vector<T> result(*this);
    result += rhs;
    return result;
}

template<typename T>
Vector<T>& Vector<T>::operator+=(const Vector<T>& rhs) {
    for (int i = 0; i < this->size; i++)
        this->vector[i] += rhs[i];

    return *this;
}

template<typename T>
Vector<T> Vector<T>::operator-(const Vector<T>& rhs) {
    Vector<T> result(*this);
    result -= rhs;
    return result;
}

template<typename T>
Vector<T>& Vector<T>::operator-=(const Vector<T>& rhs) {
    for (int i = 0; i < this->size; i++)
        this->vector[i] -= rhs[i];

    return *this;
}

为了延续返回 Vector<T> 的趋势,应该在重载 **= 运算符时使用叉积还是从点积中返回 T&?你的想法是什么?

1
你考虑过 std::valarray 吗? - quantdev
2
此问题不适合讨论,因为它完全基于个人观点。 - scohe001
4
因为存在歧义性,我会说都不是。使用类似于“交叉法”和“点乘法”之类的方法来区分它们。并非所有内容都必须是运算符。 - Greg Hewgill
@quantdev 我已经有了std::vector,但是考虑到我以后会用这个类做什么,我决定使用一个Vector类是最好的选择。不过还是谢谢你的建议! - user2958542
好的,既然我们正在谈论愚蠢的重载想法......http://coliru.stacked-crooked.com/a/3babaf324d7c7d30 - Mooing Duck
@MooingDuck,mathvector::dot 应该返回一个标量。;-) - SO_fix_the_vote_sorting_bug
3个回答

4

如果你在思考*应该代表哪种运算,那么这是一个很强的提示不要使用它。实际上,**=也可以表示逐元素相乘。避免混淆是最好的选择,所以只需使用dotcross操作的名称,并忘记*运算符。


1
你可以为标量乘法重载 *;这是自然和规范定义的。 - MicroVirus
我会为点积重载运算符,因为sqrt(dot(v, v)) == abs(v)。这与float或double sqrt(ff) == abs(f)一致。我们特别考虑L2范数,abs(v),称其为“规范”,并使用“normalize”这个词来表示v/abs(v),因此我认为我们肯定将v*v视为abs(v)^2。 - Samuel Danielson
@SamuelDanielson 如果我在源代码中看到 v *v,我会认为 operator * 被重载成点积。然而,通常情况下,对于 u * v,这可能不是很清楚。另外,正如另一个答案指出的那样,operator *= 不能被实现成点积,但可以被实现成叉积。无论是点积还是叉积都不能满足人们对标量乘法的基本直觉,这就是为什么我建议不要在这里使用运算符。除非运算符具有一些明显和明确的语义,否则命名方法始终更易读。 - Ken Wayne VanderLinde

1

如果不确定,就要避免。

这是运算符重载中最重要的建议。

只需记住对每种可能的输入类型组合都要分别应用它,所以标量乘法是可以的,点积和叉积不可考虑,因为两者都有可能。

顺便说一下:没有办法使*=表示点积,结果与任何一个参数的类型都不相同。

另外:你的Vector可能会被误认为是标准容器vector。你可能需要解决这个问题。


-1

虽然使用dotcross函数会更好,但如果您坚持使用*运算符,应该使用点积。叉积仅适用于R3中的向量,因此点积可能更有用。


叉积是特殊的,没错。真正的问题在于点积和二元积之间,因为在矩阵术语中,点积是一个行向量乘以一个列向量,而二元积是一个列向量乘以一个行向量。 - Samuel Danielson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接