C ++重载operator->()没被调用?

时间:2016-07-29 17:24:36

标签: c++ operator-overloading

任何人都可以解释为什么重载运算符 - >对于类Foo没有从Foo *类型的指针调用?

#include <iostream>
using namespace std;

class Foo {
public:
Foo * operator -> () {
    cout << "calling Foo * operator -> ()\n";
    return this;
}
    int x;
};


void main() {
    Foo f;
    Foo * pF = &f;
    pF->x;                  // Why is overloaded operator-> not being called here?
    (pF->operator->())->x;  // This works.

    cout << "End test.\n";
}

3 个答案:

答案 0 :(得分:6)

  

为什么重载运算符 - >;没被叫到这里?

因为pF是指针,而不是Foo实例。您为operator->而非Foo重叠了Foo*。您可以直接在operator->上调用重载的f

f->x;

您可能不会为operator->或任何其他指针类型重载Foo*

答案 1 :(得分:3)

您为Foo重叠了它,而不是Foo*(这是不可能的)。

这会奏效:

(f.operator->())->x;

或者,当然:

f->x;

能够使用那么短的语法是重载的全部目的,不是吗?虽然只是返回一个指向同一个对象的指针很困惑,但是你调用了操作符。

答案 2 :(得分:2)

你已超载&#34;指向&#34; Foo类型的运算符,而非类型Foo*

class Foo {
public:
    // Overload 'point-to' operator of 'Foo'
    Foo * operator -> () {
        cout << "calling Foo * operator -> ()\n";
        return this;
    }
    int x;
};

使用示例:

Foo f;
f.operator->();