C++ - 重载 [] 运算符

C++ - overloading [] operator

我有一个模板class数组:

template <class T=int, int SIZE=10>
class 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) return 是对索引为 idx 的数组值的引用,并且 T operator [](int idx) const return 是它的值。 但是,我不确定在哪种情况下将使用 [] 运算符 returned 引用或值。

此外,如果我更改 T operator [](int idx) const -> T operator [](int idx),编译器会报错。这是为什么? 我能理解编译器抱怨是因为只有 return 类型不同,但为什么添加 const 时它不抱怨?这仅意味着 class 内部的 none 被修改了,对吗?

我尝试调试这个小的主要实现:

int main() {
    int val;
    Array<> intArray;

    intArray.Initialize();
    val = intArray[1];
    printf("%d", intArray[1]);
    intArray[1] = 5;
}

并且每次调用T& operator [](int idx)。为什么?

提前致谢。

operator[] 重载将根据您调用它的对象的 const 限定进行 select。

Array<> intArray;
intArray[1]; //calls T& operator[]

const Array<> constArray;
constArray[1]; //calls T operator[]

如果从 T operator[] 中删除 const,则会出现错误,因为成员函数不能具有相同的 const 限定和参数,因为无法 select他们之间。

首先,把[]当作调用this->operator[]的语法糖。

如果 this 是一个 const 指针,将调用 const 版本,否则将调用非 const 版本。

继续,您应该使用 const T& operator [](int idx) const {,即 const 版本 return 作为 const 参考。这将节省进行深拷贝的开销。

最后,函数 const 特性是其签名的 部分。这允许您基于 const-ness 进行重载。否则你不可能有两个版本的 operator[].