C 将操作员作为类成员超载

C++ Overloading an Operator as a Class Member

本文关键字:成员 超载 操作员      更新时间:2023-10-16

我在遇到问题时试图创建一个简单的向量类。这是我的代码的片段:

class Vector2D{
protected:
    int x, y;
public:
    Vector2D operator - (const Vector2D&);    
    friend int SumDiff(const Vector2D& obj1, const Vector2D& obj2);
};
Vector2D Vector2D::operator - (const Vector2D& param)
{
    Vector2D obj;
    obj.x = x - param.x;
    obj.y = y - param.y;
    return obj;
}
int SumDiff(const Vector2D& obj1, const Vector2D& obj2)
{
    int result;
    Vector2D obj3;
    obj3 = obj1 - obj2;
    result = obj3.x + obj3.y;
    return result;
}

线obj3 = obj1 - obj2;被突出显示为错误。具体而言,此行中的操作员-似乎并未将Vector2D对象作为操作数。

即使SumDiff功能是Vector2D类的一部分,也会发生相同的问题。

此代码似乎仅在运算符-作为非成员函数重载时进行编译。为什么?

预先感谢。

必须将操作员声明为const:

Vector2D operator - (const Vector2D&) const;

其他,您不能将其与obj2一起使用,即const

正如Nathanolivier所说的那样,您还可以在班级外声明此操作员为:

Vector2D operator - (const Vector2D& left, const Vector2D& right)
{
    Vector2D obj;
    obj.x = left.x - right.x;
    obj.y = left.y - right.y;
    return obj;
}

然后,您需要使其成为类的朋友(或添加setter/getters),以便可以访问xy

您的operator -成员函数未标记为const,这意味着:

  • 指出它可以修改*this(左手Opearnd)的状态
  • 因此,不能用const合格对象作为左手操作数
  • 来调用

由于 operator -肯定应该不是修改其两个操作数,只需将其标记为const

Vector2D operator - (const Vector2D&) const;

请注意,通常最好将二进制运算符作为非会员实施。原因是隐式转换中的对称性。实现为成员的二进制运算符可以在其右侧操作数上使用隐式转换,但不能在左侧的一号上使用它们(因为操作数将需要适当的类型才能首先找到操作员)。<<<<<<<<<<<<<<

由于您通常还希望复合分配运算符存在,因此一种常见模式是根据复合分配实现非成员二进制运算符,例如:

Vector2D& Vector2D::operator -= (const Vector2D &rhs)
{
  x -= rhs.x;
  y -= rhs.y;
  return *this;
}
Vector2D operator - (Vector2D lhs, const Vector2D &rhs)
{
  lhs -= rhs;
  return lhs;
}

最后,要在生产中使用,请考虑使用boost。操作员为您进行大部分自动委托。