假设我有以下类:
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()
;这样做需要f
是Foo
(而不是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);
}
在您的示例中,本地变量b
为temp2
类型。temp2
不是指针,因此编译器对b[10]
没有任何定义。如果您想这样做,temp2
类型必须明确提供定义。
如果我正确理解了您的问题,在以下情况下,编译器将假定您正在指定您声明的数组的长度:
int A[20];
,在下种情况下,它将假定您使用的是下标操作员" []
A[2] = 3; // after variable declaration.