C++-重载[]运算符

C++ - overloading [] operator

本文关键字:运算符 重载 C++-      更新时间:2023-10-16

我有一个模板类Array:

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)返回对索引为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;
}

并且每次调用CCD_ 9。为什么?

提前谢谢。

operator[]过载将根据您调用它的对象的const资格来选择。

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

如果从T operator[]中删除const,则会出现错误,因为成员函数不能具有相同的const资格和参数,因为无法在它们之间进行选择。

首先,将[]视为调用this->operator[]的语法糖。

如果thisconst指针,则将调用const版本,否则将调用非const版本。

接下来,您应该使用const T& operator [](int idx) const {,即让const版本返回const引用。这将节省进行深度复制的开销。

最后,函数const-ness是其签名的部分。这允许您根据const-ness进行过载。否则你就不能拥有operator[]的两个版本。