C++ 运算符重载将*和*=用作点积或叉积

C++ 运算符重载将*和*=用作点积或叉积,c++,vector,C++,Vector,我正在为基本向量操作创建一个向量类,并试图确定哪一个[点积或叉积]最适合重载*和*=操作符,并希望其他人的想法 到目前为止,我已经实现了+、+=、-和-= template<typename T> Vector<T> Vector<T>::operator+(const Vector<T>& rhs) { Vector<T> result(*this); result += rhs; return res

我正在为基本向量操作创建一个向量类,并试图确定哪一个[点积或叉积]最适合重载
*
*=
操作符,并希望其他人的想法

到目前为止,我已经实现了
+
+=
-
-=

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;
}
模板
向量向量::运算符+(常量向量和rhs){
矢量结果(*此);
结果+=rhs;
返回结果;
}
模板
向量和向量::运算符+=(常量向量和rhs){
对于(inti=0;isize;i++)
这->向量[i]+=rhs[i];
归还*这个;
}
模板
向量向量::运算符-(常量向量和rhs){
矢量结果(*此);
结果-=rhs;
返回结果;
}
模板
向量和向量::运算符-=(常量向量和rhs){
对于(inti=0;isize;i++)
此->向量[i]=rhs[i];
归还*这个;
}
若要继续返回
向量的趋势,应将叉积用于
*
*=
运算符重载,或使用点积返回
T&


您的想法是什么?

您想知道
*
应该是哪个操作,这是一个强烈的提示,提示您不要使用它。事实上,
*
*=
也可能意味着组件式乘法。避免混淆是最好的选择,因此只需使用名称
交叉
,并忘记
*
运算符。

如果有疑问,请放弃。

这是对你最重要的建议

只需记住将其分别应用于可能的输入类型的每个组合,因此标量乘法是可以的,点积和叉积是可以的,因为两者都是合理的,不应考虑

顺便说一句:没有办法使
*=
表示点积,结果与两个参数的类型不同


旁白:您的
向量
可能很容易与标准容器
向量
混淆。您可能需要解决这个问题。

虽然使用
交叉
函数会更好,但如果您坚持使用
*
运算符,则应该使用点积。叉积只对R3中的向量有效,所以点可能更有用。

你考虑过吗?这个问题是离题的,因为它完全是基于观点的。由于模糊性,我两个都不说。使用
交叉
方法和
方法来区分它们。不是所有的东西都必须是运算符。@quantdev我有并且也有
std::vector
,但是在考虑了以后我将如何处理这个类之后,我认为最好的是
vector
类。谢谢你的想法!好吧,只要我们谈论的是愚蠢的超载想法。。。。您可以为标量乘法重载
*
;这是一个自然的、规范的定义。我将重载操作符*用于点,因为sqrt(点(v,v))==abs(v)。这与浮点或双sqrt(f*f)==abs(f)一致。我们特别考虑了L2范数,abs(v),称之为范数,我们用“normalize”来表示v/abs(v),所以我要说的是,我们肯定认为v*v是abs(v)^2。@SamuelDanielson是的,如果我在源代码中看到
v*v
,我会假设
操作符*
作为点积重载。但是,一般来说,对于
u*v
,这可能并不清楚。另外,正如另一个答案所指出的,
操作符*=
不能实现为点积,而可以实现为叉积。点积和叉积都不能满足人们对标量乘法的所有基本直觉,这就是为什么我不建议在这里使用运算符的原因。命名方法总是更具可读性,除非运算符具有明确和明显的语义。真正的问题是在点和并矢积之间,因为矩阵项中的点积是行向量乘以列向量,并且并矢积是列向量乘以行向量。