在这种情况下,很明显,cmylist [ 2 ] = 3元2到3的值设置!
为什么操作符[]返回一个引用
让我们仔细看看如何cmylist [ 2 ] = 3评价。因为下标操作符比赋值操作符的优先级更高,cmylist [ 2 ]首先评估。cmylist [ 2 ]调用操作符[],我们把它定义为返回一个参考cmylist m_anlist [ 2 ]。因为操作符[]是返回一个引用,则返回实际cmylist m_anlist [ 2 ]数组元素。我们的部分评估的表达变得cmylist。m_anlist [ 2 ] = 3,这是一个简单的整数分配。
在变量一看这一课,你知道在赋值语句的左边的任何值必须是一个左值(这是一个变量,一个实际的内存地址)。通过返回一个引用,编译器是满意的,我们正在返回左值。考虑会发生什么,如果操作符[]返回一个整数的值,而不是通过参考。cmylist [ 2 ]将调用操作符[],它将返回值的cmylist m_anlist [ 2 ]。
例如,如果m_anlist [ 2 ]有价值的6,运营商[ ]将返回值6。例如,如果m_anlist [ 2 ]有价值的6,运营商[ ]将返回值6。cmylist [ 2 ] = 3将部分评估6 = 3,这是没有意义的!如果你尝试这样做,C++编译器会抱怨:C:\ vcprojects CPP测试。(386):错误C2106:“=”:左操作数必须是左值
C:\ vcprojects CPP测试。(386):错误C2106:“=”:左操作数必须是左值
规则:返回的值的引用或指针可以左值或右值。返回的值的值只能是右值。
结论
下标操作符通常是重载提供一维数组元素包含在一个类。因为字符串是典型的字符数组实现,运营商[ ]往往是在字符串类以允许用户访问一个字符的字符串。
重载的下标操作符的另一个好处是,我们可以让它比直接安全访问数组。通常情况下,当访问数组,下标操作符不检查是否该索引是有效的。例如,编译器不会抱怨下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include
<cassert> // for assert() class
IntList { private : int
m_anList[10]; public : int &
operator[] ( const
int
nIndex); }; int &
IntList::operator[] ( const
int
nIndex) { assert (nIndex
>= 0 && nIndex < 10); return
m_anList[nIndex]; } |