在涉及此one的问题中,我有一个小例子:
#include <iostream>
struct Point {
int x, y;
Point(int x, int y): x(x), y(y) {};
Point operator+(const Point& other) const {
return Point(x + other.x, y + other.y);
}
};
std::ostream& operator<<(std::ostream& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}
int main() {
Point a = Point(4, 7);
Point b = Point(8, 3);
Point p = a + b;
std::cout << a << " + " << b << " = " << p << std::endl;
}
将operator<<
重载与operator+
重载一起放置会更优雅。但是在这种情况下,我需要使用friend
关键字。
为什么不能以类似于operator+
重载的方式编写此重载?
std::ostream& Point::operator<<(std::ostream& os) {
return os << "(" << x << ", " << y << ")";
}
从这个answer我可以读到:
但是,它们的左操作数是标准库中的流,而当您为自己实现输出和输入操作时,虽然标准库定义的大多数流输出和输入运算符的确定义为流类的成员。类型,则不能更改标准库的流类型。因此,您需要针对自己的类型将这些运算符实现为非成员函数。
这种移栽对我来说仍然有些晦涩。