为什么操作符

在这种情况下,很明显,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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值