表达式中的C++运算符重载

C++ Operator Overloading in expression

本文关键字:运算符 重载 C++ 表达式      更新时间:2023-10-16

我确信这个问题已经在某个地方得到了答案,但我不知道该搜索什么。

我有以下情况。我创建了一个Vector类,并重载了"*"(乘以escalar)和"+"运算符(加上两个向量)。现在,下面的代码行:

Vector sum = (e_x*u_c) + (e_y*u_r);

这给了我以下错误:

error: no match for 'operator+' in '((Teste*)this)->Teste::e_x.Vector::operator*(u_c) + ((Teste*)this)->Teste::e_y.Vector::operator*(u_r)'

但是,如果我将此错误行替换为:

Vector aux = (e_x*u_c);
Vector aux2 = (e_y*u_r);
Vector sum = aux + aux2;

我一点错误都没有。为什么?这两个表达方式不应该是等价的吗?

编辑:以下是我对"*"answers"+"的定义:]

Vector Vector::operator+(Vector& right)
{
    return Vector(x + right.x, y + right.y, z + right.z);
}
double Vector::operator*(Vector& right)
{
    return this->scalar_product(right);
}

Vector& right替换为const Vector& right

表达式(e_x*u_c)是一个右值,对非常数的引用不会绑定到右值。

此外,成员函数本身也应标记为const

Vector Vector::operator+(const Vector& right) const
{
    return Vector(x + right.x, y + right.y, z + right.z);
}
double Vector::operator*(const Vector& right) const
{
    return this->scalar_product(right);
}

scalar_product也必须被标记为const。请在此处阅读有关常量正确性的更多信息。

声明不正确。

T T::operator +(const T& b) const;​
T T::operator *(const T& b) const;

C和C++中的运算符