struct Point
{
int x, y;
Point(int x = 0, int y = 0): x(x), y(y) {} // 构造函数
};
Point operator + (const Point &A, const Point &B)
{
return Point(A.x + B.x, A.y + B.y);
}
就拿上面的重载运算符函数为例,为什么参数要使用 const 引用呢?
换个角度思考,如果我们不使用 const 形参,那么我们还可以写成什么样的形式?同时,我们还得保证对形参的操作不会影响到实参。那么,有以下的两种替代方案:
Point operator + (const Point A, const Point B)
{
return Point(A.x + B.x, A.y + B.y);
}
或者
Point operator + (Point A, Point B)
{
return Point(A.x + B.x, A.y + B.y);
}
如果不考虑可能会对原来的实参进行的误操作,那么,还可以写成下面的形式,这样对于最后这个函数的功能是没有影响的。
Point operator + (Point &A, Point &B)
{
return Point(A.x + B.x, A.y + B.y);
}
那么,为什么推荐 const 引用的写法呢?我们比较一下即可。第一种替代方案需要拷贝很多东西,第二种也需要拷贝很多东西,这两种之中又以第一种更优一点,因为 const 保证了不会对形参进行改变。第三种的缺点,相比于 const 引用来讲,是不安全,因为它可能会对实参进行误操作从而导致实参的改变。
综合效率和安全性,const 引用就是最优的写法了。
按:关于上面的拷贝很多东西,其实是内存方面的知识,这方面我暂时没有接触到,先这么粗浅地理解,将就一下吧。
参考:https://blog.csdn.net/qq_26849233/article/details/71425492