在通过该类中定义的指针调用类方法的情况下的语法

Kor*_*icz 2 c++

我有一个类定义如下:

class A
{
public:
    A()
    {
        fp = &A::f;
    }

    void (A::*fp)();

    void f()
    {
        cout << "A::f()" << endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

在main函数中,我定义了A类的对象,我想调用a.fp().但是,我发现我既不能用a.fp()也不用(a.fp)().最后,(a.*a.fp)()从语法的角度来看,这是完全奇怪的.

int main()
{
    A a;
    (a.*a.fp)();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释(a.*a.fp)()实际上意味着什么,为什么(a.fp)()不起作用?

Sto*_*ica 5

让我们添加括号以使分组显式:

( a.*(a.fp) )() 
Run Code Online (Sandbox Code Playgroud)
  1. a.fp是对fp内部指针指向的常规访问a.
  2. a.*(...) 使用指向成员访问运算符的指针,通过间接检索成员函数.

  3. (...)()在"callable"表达式中执行函数调用(...).

至于为什么(a.fp)()不起作用.这是因为指向成员的指针不像常规指针.您需要将它们应用于对象,即类的实例.因此,a.fp只检索指向成员的指针,该指针本身不是可调用类型.如果不应用于对象,则不能调用它,通过.*生成可调用表达式可以实现什么.