C 操作员超载[]



假设我有以下类:

class temp1 {
private:
    int A;
    double B;
};
class temp2 {
private:
    int A[20];
    double B;
};
void main() {
    temp1 a[100];
    temp2 b;
}

现在的问题是,为什么我只需要为temp2而不是temp 1 aswell超载运算符[]?我知道,要在类临时2中获得10个索引,我确实需要超载运算符[](temp1 a [100])因此,编译器如何知道我将使用[]运算符而不超载一个。

在您的示例中,本地变量a array T类型数组的值不像具有T类型的值,其行为与类型T*的指针更相似。


指针(也不是数组)不能直接使用,就像它们指向的类型一样。

考虑此Foo类型:

class Foo {
    public: doStuff() {
        std::cout << "hello" << std::endl;
    }
};

如果我有

Foo* f = new Foo[2];

我不能说 f.doStuff();这样做需要fFoo(而不是Foo*)。

为了从f获得Foo,我必须将其作为*f。例如

(*f).doStuff(); // -> hello

这清楚地表明,C 将指针类型视为特殊 - 它们自动定义了特殊操作,其中之一是*

i将f定义为两个元素的(动态分配)数组。

我们可以使用*f使用f[0]

第二个元素可以由*(f+1) f[1]

引用

[]是C 中指针(和数组)类型的另一个特殊操作员。含义或多或少是

T& operator[](T* pointer, int index) {
    return *(pointer + index);
}

在您的示例中,本地变量btemp2类型。temp2不是指针,因此编译器对b[10]没有任何定义。如果您想这样做,temp2类型必须明确提供定义。

如果我正确理解了您的问题,在以下情况下,编译器将假定您正在指定您声明的数组的长度:

int A[20];

,在下种情况下,它将假定您使用的是下标操作员" []

A[2] = 3; // after variable declaration.

最新更新