用于赋值和检索的括号重载;常数,参考 关于C++中的重载括号,我的编译器使用Mutoter方法进行访问。谁能告诉我为什么 1. const int & Cheese::operator [] (int i)const { return weight[i]; } //accessor 2. int & Cheese::operator [] (int i) { return weight[i]; } //mutator

用于赋值和检索的括号重载;常数,参考 关于C++中的重载括号,我的编译器使用Mutoter方法进行访问。谁能告诉我为什么 1. const int & Cheese::operator [] (int i)const { return weight[i]; } //accessor 2. int & Cheese::operator [] (int i) { return weight[i]; } //mutator,c++,overloading,accessor,brackets,mutators,C++,Overloading,Accessor,Brackets,Mutators,例如,下面的cout命令使用上面的mutator函数定义-2访问数据 Cheese cheddar; cout << cheddar[2] << endl; 两者加起来如下: cheddar[2] = cheddar[1]; 在那里,rhs只是一个获得者。它只检索cheddar[1]的值,不改变任何内容,因此可以是常量。相反,lhs括号重载切达[2]起到了设置器的作用;该值可以更改,函数返回值不能是常量。它为任何常量实例(如const Cheese或const Che

例如,下面的cout命令使用上面的mutator函数定义-2访问数据

Cheese cheddar;
cout << cheddar[2] << endl;
两者加起来如下:

cheddar[2] = cheddar[1];

在那里,rhs只是一个获得者。它只检索cheddar[1]的值,不改变任何内容,因此可以是常量。相反,lhs括号重载切达[2]起到了设置器的作用;该值可以更改,函数返回值不能是常量。

它为任何常量实例(如const Cheese或const Cheese)调用第一个值,为可变实例调用第二个值。

它为任何常量实例(如const Cheese或const Cheese)调用第一个值,为可变实例调用第二个值。

以防您关心自己的工作方式可以大致得到您想要的效果,具体来说,执行一个函数来获取值,其他代码来设置值,可靠地说,有一种方法可以做到这一点

通常的方法是返回代理,而不是直接返回值或对它的引用。代理重载运算符T和运算符=

然后,您的重载只返回以下内容的一个实例:

Proxy<Cheese &> operator[](int i) { return Proxy<int>(weight[i]); }
Proxy<Cheese const &> operator[](int i) const { return Proxy<int>(weight[i]); }

请注意,在第二种情况下,T的类型为Cheese const&而operator=不是const成员函数,因此在这种情况下,您将无法使用operator=,这正是您通常想要的。

如果您关心的是一种方法,您可以大致获得您特别想要的效果,即执行一个函数来获得值,和其他设置值的代码,可靠地,有一种方法可以做到这一点

通常的方法是返回代理,而不是直接返回值或对它的引用。代理重载运算符T和运算符=

然后,您的重载只返回以下内容的一个实例:

Proxy<Cheese &> operator[](int i) { return Proxy<int>(weight[i]); }
Proxy<Cheese const &> operator[](int i) const { return Proxy<int>(weight[i]); }

注意,在第二种情况下,T的类型为Cheese const&并且operator=不是const成员函数,因此,在这种情况下,您将无法使用运算符=,这正是您通常需要的。

const,即,在类实例的函数声明之后就是罪魁祸首。const,即,在类实例的函数声明之后就是罪魁祸首。oooooooh ok。。。我认为这是有背景的。我把它们理解为getter和setter,其中1用于获取,2用于设置。这里,编译器使用1从常量实例获取数据,使用2为可变实例获取和设置数据。顿悟哦好的。。。我认为这是有背景的。我把它们理解为getter和setter,其中1用于获取,2用于设置。这里,编译器使用1从常量实例获取数据,使用2为可变实例获取和设置数据。那么,实例的用法是什么样的呢?有了这个代理,您就可以像操作符[]直接做事情一样使用它。它的一个重要区别是,如果您依赖于用户定义的隐式转换,那么这已经使用了隐式的、用户定义的转换,并且表达式中只允许一个转换。那么,实例的用法会是什么样的呢?有了这个代理,您就可以像操作符[]直接做事情一样使用它。它的一个重要区别是,如果您依赖于隐式进行的用户定义转换,那么这已经使用了隐式的、用户定义的转换,并且表达式中只允许一个转换。
Proxy<Cheese &> operator[](int i) { return Proxy<int>(weight[i]); }
Proxy<Cheese const &> operator[](int i) const { return Proxy<int>(weight[i]); }