重载运算符

回复帖子

@JimmyFlower 2020-09-16 19:34 回复
struct node
{
    int x,y;
    bool operator < (const node &p) const
    {
        return x<p.x;
    }
};

括号里的const&不加会有什么区别吗

@xiaozengXW 2020-09-16 19:36 回复 举报

@JimmyFlower

  • 加了 const p 的值就不会被改变。
  • & 的话是节省内存空间,调用时直接访问 p 的内存而不是复制一遍。
@Piwry 2020-09-17 07:20 回复 举报

@JimmyFlower

#include <cstdio>
#include <algorithm>
using std::sort;

struct S{
    int a, b;
    S(){}
    bool operator < (const S &B){
        return a < B.a;
    }
}A[20];

const S w;

int main(){
//  sort(A, A+5);
    printf("%d", w < A[0]);
}

运行一下是会报错的,原因就是结构体没定义常量实例和非常量实例< 成员函数;

同理,如果把重载函数改成:

bool operator < (S &B) const{
    return a < B.a;
}

然后把下面的比较改成:

A[0] < w

也会报错,原因是没定义非常量实例和常量实例< 成员函数


具体来说,这个函数:

bool operator < (const S &B) const{
    return a < B.a;
}

里面一共有两个 const。前一个 const 使得 < 右侧的元素可以是一个常量实例,后一个 const 使得左侧的元素可以是一个常量实例


如果你平常有用 sort 排序结构体,且直接在结构体里重载 < 运算符的话,你会发现这两个 const 哪个不加都会报错

反馈
如果你认为某个帖子有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。