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.这将是糟糕的,事实上,编译器甚至不会让你这样做.