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[].
因为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)
| 归档时间: |
|
| 查看次数: |
13852 次 |
| 最近记录: |