C++ C++;将运算符重载为类成员
当我遇到一个问题时,我正试图创建一个简单的向量类。 这是我的代码片段:C++ C++;将运算符重载为类成员,c++,operator-overloading,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 - (con
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/getter),以便可以访问x
和y
。您的运算符-
成员函数未标记为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;
}
最后,为了在生产中使用,请考虑使用此大部分自动授权给您。
或使用标准约定并声明为免费函数。抱歉,错过了这一点。