运算符“+”的重载
class Point { private: int m_xPosition; int m_yPosition; public: Point(int xPosition = 0, int yPosition = 0); //构造函数 声明 const Point operator+(const Point& point) const; //重载运算符+ 声明 }; //构造函数 定义 Point::Point(int xPosition, int yPosition) : m_xPosition(xPosition), m_yPosition(yPosition) {} //重载运算符+ 定义 const Point Point::operator+(const Point& point) const { return Point(this->m_xPosition + point.m_xPosition, this->m_yPosition + point.m_yPosition); }
现在让我们思考一下,为什么要把运算符+的重载写的这么“复杂”?
首先,由于我把重载函数写成了成员函数,所以a + b就相当于a.operator+(b),+左边的变量将视为函数调用者,右边的将视为参数。
所以a+b实际上就是函数调用,既然这样就得好好考虑返回值类型以及参数类型
1. 显然我们不希望,a+b的过程中a的值或者b的值发生变化,所以参数的类型一定有const修饰符,接着引用可以很好的减少额外资源的开销,提高效率,所以参数的类型就确定了,是const Point&
2. 我们希望能够实现连+,比如(a + b + c)这相当于(a.operator+(b).operator+(c)),所以函数的返回值类型肯定是Point
3. 我们还希望这个函数有一定的自检功能如(a + b = c)这种毫无意义的等式能够鉴别出来,因为有时候我们会把如(a + b == c)写成(a + b = c)。所以返回值类型要是const,因为const变量不能被赋值,但又因为const对象只能调用const函数。
所以综上三种原因得出:const Point operator+(const Point& point) const;的函数声明
由此分析我们马上可以得出,+,-,*,/ 的重载函数大体都是一样的。
class Point { private: int m_xPosition; int m_yPosition; public: Point(int xPosition = 0, int yPosition = 0); //构造函数 声明 const Point operator+(const Point& point) const; //重载运算符+ 声明 const Point operator-(const Point& point) const; //重载运算符- 声明 const Point operator*(const Point& point) const; //重载运算符- 声明 const Point operator/(const Point& point) const; //重载运算符- 声明 }; //构造函数 定义 Point::Point(int xPosition, int yPosition) : m_xPosition(xPosition), m_yPosition(yPosition) {} //重载运算符+ 定义 const Point Point::operator+(const Point& point) const { return Point(this->m_xPosition + point.m_xPosition, this->m_yPosition + point.m_yPosition); } //重载运算符- 定义 const Point Point::operator-(const Point& point) const { return Point(this->m_xPosition - point.m_xPosition, this->m_yPosition - point.m_yPosition); } //重载运算符* 定义 const Point Point::operator*(const Point& point) const { return Point(this->m_xPosition * point.m_xPosition, this->m_yPosition * point.m_yPosition); } //重载运算符/ 定义 const Point Point::operator/(const Point& point) const { if(point.m_xPosition != 0 || point.m_yPosition != 0) return Point(this->m_xPosition / point.m_xPosition, this->m_yPosition / point.m_yPosition); }