c++中按值返回的[]重载和返回引用的[]重载有什么区别讲究,为什么同时定义这么两个?

图片说明

c++primer plus的P540

首先需要解释的是 取址符号 '&',第一个operator 前的类型是double & ,也就是说,

Student a; 
a[0] = 1.1;

那么 a对象里面的scores[0]的值就会真的被改变.
这样可能不明显我们换一个函数你就有感觉了

class Student
{
public:
    int id[20];
    int& at(int x)
    {
        return id[x%20];
    }
};
int main(void)
{
    Student a;
    a.at(0) = 4;
    cout<< a.id[0];
    return 0;
}

这是第一个函数的作用,就是让**外部能使用运算符直接修改这个对象里面的值**,而不是使用 一个函数setScores(int index,double value);

第二个后面加上了const,也就意味着这个函数与上一个函数不一致,注意这并不是重载,在编译器里认为这两个函数是不一样的函数,const表示他可以被const 属性的对象调用;
同时也是因为重载函数不允许传参一致但返回值类型不一致;

那么加上这个关键字之后的作用是什么呢?

作用就是: 这个函数内做的所有操作都不能改变this->里面的任何值,调用方法也只能调用const 后缀的方法,但是相对的如果我们 定义了一个变量

const Student a,那么我使用 a[0]那么就只能是第二个函数.
不知道这样解释你明白了么