运算符重载&模板写法
运算符重载写为成员函数还是全局函数的格式,取决于你所要达到的目的。
重载为成员函数,那么该运算符的左边必须是某个类的对象实例。
重载为全局函数,可以自定义该运算符的左边是什么东西,右边是什么东西。左边接受范围是第一个参数类型,右边接受范围是第二个参数类型。
运算符重载的注意点:
一些常见的运算符重载模板:
#include <iostream> using namespace std; class Point { int x; int y; public: Point(int x1 = 0, int y1 = 0) :x(x1), y(y1) {} Point(const Point& p) :x(p.x), y(p.y) {} // 输入输出运算符重载 friend ostream& operator<<(ostream& output, const Point& p); friend istream& operator>>(istream& input, Point& p); // 第一个const保证了返回值不可被再次修改 // 第三个const保证了const变量也能调用该操作符,也可保证成员变量不被修改 const Point operator+ (const Point &p) const { return Point(x + p.x, y + p.y); } const Point operator- (const Point& p) const { return Point(x - p.x, y - p.y); } Point& operator+= (const Point& p) { x += p.x; y += p.y; return *this; } // 逻辑运算符 bool operator== (const Point& p) const { return (x == p.x) && (y == p.y); } bool operator!= (const Point& p) { return (x != p.x) || (y != p.y); } // 负号,取反运算符 const Point operator-() const { return Point(-x, -y); } //前置++ Point& operator++() { x++; y++; return *this; } //后置++(括号内的int不可省略,不可更改) const Point operator++(int) { Point old = *this; x++; y++; return old; } void info() { cout << "(" << x << "," << y << ")" << endl; } }; ostream& operator<<(ostream& output, const Point& p) { output << "(" << p.x << "," << p.y << ")"; return output; } istream& operator>>(istream& input, Point& p) { input >> p.x >> p.y; return input; } int main() { Point p1(10, 20); Point p2(20, 30); Point p3; cout << p1 << endl; cin >> p3; cout << p3 << endl; return 0; }