代码之家  ›  专栏  ›  技术社区  ›  Lodle

指针上的下标运算符

  •  12
  • Lodle  · 技术社区  · 15 年前

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

     MyClass *a = new MyClass();
     a[1];
    

    但必须这样做:

     MyClass *a = new MyClass();
     (*a)[1];
    
    4 回复  |  直到 8 年前
        1
  •  16
  •   James McNellis    14 年前

    这是因为不能为指针类型重载运算符;只能在至少一个参数(操作数)属于类类型或枚举类型的情况下重载运算符。

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

    在你的例子中, a 有类型 MyClass* ;这是指针类型,因此内置 operator[] 用于指针。当您取消引用指针并获取 MyClass ,您有一个类类型对象,因此 操作员[ ] 使用。

        2
  •  7
  •   msw    15 年前

    因为 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;
    }
    
        3
  •  3
  •   catchmeifyoutry    15 年前

    简单地说,用 a[1] 这个 a 指针被视为包含数组的内存,您试图访问数组中的第二个元素(不存在)。

    这个 (*a)[1] 强制首先在指针位置获取实际对象, (*a) ,然后呼叫 [] 接线员。

        4
  •  1
  •   Stick    8 年前

    好消息。你也可以…

    A->运算符[](1);

    要添加到首选答案中,请将运算符重载视为重载函数。

    重载类的成员函数时,请记住指针不属于该类类型。