我有一个模板类Array:
templateclass Array { T TheArray[SIZE]; public: void Initialize() { for (int idx=0; idx < SIZE; idx++) { TheArray[idx] = T(); } } T& operator [](int idx) { return TheArray[idx]; } T operator [](int idx) const { return TheArray[idx]; } }
我有一些关于运算符[]
重载的问题(我在网上找到了这个例子).
我理解T& operator [](int idx)
返回引用带索引的数组值idx
并T operator [](int idx) const
返回其值.但是,我不确定在哪种情况下使用[]
运算符将返回引用或值.
另外,如果我改变T operator [](int idx) const
- > T operator [](int idx)
,编译器会抱怨.这是为什么?我可以理解编译器抱怨因为只有返回类型不同,但是为什么它在const
添加时不会抱怨?这只意味着修改了类的内部,对吧?
我试图调试这个小的主要实现:
int main() { int val; Array<> intArray; intArray.Initialize(); val = intArray[1]; printf("%d", intArray[1]); intArray[1] = 5; }
每次都T& operator [](int idx)
被召唤.为什么?
提前致谢.
在operator[]
过载将根据选择const
调用它的对象的企业资质.
Array<> intArray; intArray[1]; //calls T& operator[] const Array<> constArray; constArray[1]; //calls T operator[]
如果删除const
from T operator[]
,则会出现错误,因为成员函数不能具有相同的const
-qualification和参数,因为无法在它们之间进行选择.
首先,[]
作为呼唤的语法糖this->operator[]
.
const
如果this
是const
指针则调用该版本,否则const
将调用非版本.
继续,您应该使用const T& operator [](int idx) const {
,即让const
版本返回const
引用.这将节省深度复制的开销.
最后,const
函数的性质是其签名的一部分.这允许您基于const
-ness 重载.否则你不能拥有这两个版本operator[]
.