指针上的下标运算符

Lod*_*dle 12 c++ operator-overloading

如果我有一个指向具有重载下标operator([])的对象的指针,为什么我不能这样做:

 MyClass *a = new MyClass();
 a[1];
Run Code Online (Sandbox Code Playgroud)

但必须这样做:

 MyClass *a = new MyClass();
 (*a)[1];
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 16

这是因为你不能为指针类型重载运算符; 您只能重载一个运算符,其中至少有一个参数(操作数)是类类型或枚举类型.

因此,如果您有一个指向某个类类型的对象的指针,该对象重载了下标运算符,则必须取消引用该指针才能调用其重载的下标运算符.

在你的例子中,a有类型MyClass*; 这是一个指针类型,因此使用了内置的operator[]指针.当您取消引用指针并获取a时MyClass,您有一个类类型对象,因此使用了重载operator[].


msw*_*msw 7

因为a是指向MyClass而不是MyClass的类型指针.更改语言以支持您期望的使用将使许多其他语言语义中断.

您可以从中获得所需的语法结果:

struct foo {
    int a[10];
    int& operator [](int i) { return a[i]; }
};

main() {
    foo *a = new foo();
    foo &b = *a;
    b[2] = 3;
}
Run Code Online (Sandbox Code Playgroud)