#include <iostream>
using namespace std;
class Point {
private:
int x, y; // Private data members
public:
Point(int x = 0, int y = 0); // Constructor
int getX() const; // Getters
int getY() const;
void setX(int x); // Setters
void setY(int y);
void print() const;
const Point operator+(const Point & rhs);
// Overload '+' operator as member function of the class
};
int main(int argc, char** argv)
{
Point p1(1, 2), p2(4, 5);
// Use overloaded operator +
Point p3 = p1 + p2;
p1.print(); // (1,2)
p2.print(); // (4,5)
p3.print(); // (5,7)
// Invoke via usual dot syntax, same as p1+p2
Point p4 = p1.operator+(p2);
p4.print(); // (5,7)
// Chaining
Point p5 = p1 + p2 + p3 + p4;
p5.print(); // (15,21)
return 0;
}
// Constructor - The default values are specified in the declaration
Point::Point(int x, int y) : x(x), y(y) { } // Using initializer list
// Getters
int Point::getX() const { return x; }
int Point::getY() const { return y; }
// Setters
void Point::setX(int x) { this->x
= x; } // (*this).x = x; x = x
void Point::setY(int y) { this->y = y; }
// Public Functions
void Point::print() const {
cout << "(" << x << "," << y << ")" << endl;
}
// Member function overloading '+' operator
const Point Point::operator+(const Point & rhs) {
return Point(x + rhs.x, y + rhs.y);
}
我正在研究操作员超载,但我不明白为什么会收到错误。
error: no match for 'operator+' (operand types are 'const Point' and 'Point')
我故意删除const
函数末尾的operator+
限定符,以便了解它。有人可以明确解释我为什么需要它吗?
答案 0 :(得分:2)
会员
const Point Point::operator+(const Point & rhs);
是非const成员,即要求操作的lhs是可变的,但是(如错误消息所示)您需要具有const
lhs的操作。因此,您必须声明运算符
Point Point::operator+(const Point & rhs) const;
请注意,我还删除了返回类型的const
,因为它已弃用。
为什么需要const
?自然+
运算符(例如算术类型之间)不改变其参数,因此通常(使用此运算符的约定隐式假设参数未被更改。在您的特定情况下,a+b
的返回显式const
(虽然已弃用AFAIK),因此在a+b+c
= (a+b)+c
中,lhs为const
并且不能使用非const成员函数。
此外,只要成员函数不改变其对象的状态,就应该声明它const
,以便可以为const
对象调用它。
或者,可以将此运算符定义为非成员函数朋友
Point operator+(const Point&lhs, const Point&rhs);
更清楚地表达了lhs和rhs之间的对称性(你的非const成员的相应函数将是
Point operator+(Point&lhs, const Point&rhs);
)。
答案 1 :(得分:1)
您需要将方法定义为const
,即:
const Point operator+(const Point & rhs) const;
p1+p2
会返回const Point
,因此您需要const Point + const Point
运算符才能计算(p1+p2)+p3
。
答案 2 :(得分:1)
答案很好,但他们没有解释为什么 const是一个问题。简单的原因是链接顺序和运算符类型匹配。
Point p5 = p1 + p2 + p3 + p4;
// is interpreted as:
Point p5 = ConstPoint( (Point(p1)).operator+((const Point&)(p2)) + p3 + p4;
// as operator+ is left-to-right , not right-to-left !!!
Point和const Point是不同的类型,所以在第一个解释中,你有一个:
p5 = const Point(sumP1P2) . operator+ (Point(P3)) /*+ P4 awaiting interpretation */;
// whose search will be for a const LHS - i.e. "Point operator=(constPointRef) const;" - which is bound to fail.
以下内容可行:
const P& operator+(const P& rhs) const; // corresponds to const P& result = const P& lhs + const P& rhs
P operator+(P rhs) const; // corresponds to copy-by-value for all operands.
答案 3 :(得分:0)
唯一的问题是&#34; const&#34;点算子+(const Point&amp; rhs);删除def和dec中的那个..它会起作用