const Point operator+(const Point &point) const{
}
尝试去理解const,然后搞懂为什么这里放置const。
const 用于修饰其后面跟着的名字,使其为常量,不可被修改。
1.第一个const 的位置后面是函数返回值类型,表明函数返回的是常量!
2.第二个const 的位置后面是函数参数,表明读取参数时,将其视为常量,保证当传参为const类型时也可接受,否则如果只是接受变量,那么就无法处理+常数的操作。
3.第三个const后面表面看没有东西,其实可以视为缺省了类自身,或者可以认为其修饰的是this指针。那么这里的意义是,使得调用operator+的这个。
大佬的参考链接对象可以是const类型。
笔者运行了第三const的代码后:
#include<bits/stdc++.h>
using namespace std;
struct Point{
int x,y;
Point(int a,int b):x(a),y(b){};
const Point operator+(const Point &tmp){
return Point(x+tmp.x,y+tmp.y);
}
};
int main(){
//freopen("in.txt","r",stdin);
const Point p1 = Point(10, 20);
Point p2 = Point(20, 30);
Point p3 = p1 + p2; // 不加第3个const,这里会报错,因为p1是常数
// 注意,这里p1是常量,p2是变量,由于重载了“+”
// 上一句代码等同于 p1.operator+(p2);
// 由p1调用的operator+函数,因此调用该函数的是个常数。
cout<<p3.x<<" "<<p3.y<<endl;
return 0;
}
报错信息为:
这里可以看到,重载运算符函数不匹配“const Point”与“Point”的相加类型,因为如果不加第三个const时,调用此运算符的对象是变量,而在C++中 const object-> 变量是不允许的,因为一旦变为变量,那么就意味着可以修改这个对象的内容,也就违背了const的定义,故报错。
额外知识:C++中变量->const object是允许的,作用范围仅为当前函数内,所以传参时即便加了第二个const,传递变量类型也不会报错。
疑问:
1.如果加了第一个const是否会导致p3无法修改呢?不会,只是p1+p2的返回值是常量类型,但是还有个赋值=操作,赋值之后,p3还是变量。