c ++两个版本的重载下标运算符

Sim*_*ley 9 c++ operator-overloading subscript

我的问题是关于:

const T& operator[](const int nIndex) const;
Run Code Online (Sandbox Code Playgroud)

和:

T& operator[](const int nIndex);
Run Code Online (Sandbox Code Playgroud)

为什么我需要在课堂上定义它们,目的是什么?后者不足够吗?

Jos*_*eld 15

const在其末尾的成员函数声明允许甚至在const对象上调用该函数.这仅适用于不修改对象状态的成员函数.

假设您调用了重载这些运算符的类X.据推测,它的行为有点像容器,通过它可以访问它包含的元素operator[].

现在让我们说用户想要使用const X:

const X x = /* fill it */;
use(x[0]);
Run Code Online (Sandbox Code Playgroud)

是否允许用户这样做?大概.如果他们想要一个不可变的容器,那就让他们拥有它.如果您没有提供const版本operator[],他们将无法执行此操作.他们毕竟不是试图修改容器,他们只是看着它的内容.

现在为什么要使const版本operator[]返回const参考?因为它必须.它返回对类本身成员的引用.如果容器是const并且返回了非const引用,则调用者只能通过使用此运算符来修改其内部:

const X x = /* fill it */;
x[0].modify();
Run Code Online (Sandbox Code Playgroud)

哦,亲爱的,我们修改状态,x即使它是const.这将是糟糕的,事实上,编译器甚至不会让你这样做.