C ++将运算符重载为类成员

时间:2016-12-16 17:12:34

标签: c++ operator-overloading

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

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类的一部分,也会出现同样的问题。

如果运算符-作为非成员函数重载,则此代码似乎只能编译。为什么呢?

提前致谢。

2 个答案:

答案 0 :(得分:3)

您的运算符必须声明为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

答案 1 :(得分:1)

您的operator -会员功能未标记为const,这意味着:

  • 声明它可以修改*this(左侧opearnd)
  • 的状态 因此,
  • 无法使用const限定对象作为左侧操作数
  • 进行调用

由于operator -应该修改其任何一个操作数,只需将其标记为const

Vector2D operator - (const Vector2D&) const;

请注意,通常,在可能的情况下,将二元运算符实现为非成员通常会更好。原因是隐式转换中的对称性。作为成员实现的二元运算符可以在其右侧操作数上使用隐式转换,但不能在左侧使用它们(因为操作数首先需要正确的类型来查找运算符)。 / p>

由于您通常也希望复合赋值运算符存在,因此常见的模式是根据复合赋值实现非成员二元运算符,如下所示:

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.Operators为您执行大部分自动委派。