具有指向成员函数

时间:2016-05-28 17:37:26

标签: c++ class pointers

我们知道要创建一个指向函数的“公共”指针,例如:

void fun();
void (*ptr)() = fun;

函数的名称也是函数启动的地址。所以我不需要使用地址运算符&像这样:

void (*ptr)() = &fun;

现在,对于指向成员函数的指针,我必须使用地址运算符。例如,对于具有指向成员函数ptr和函数fun()的类A,我必须写:

void(A::*ptr)() = &A::fun;

为什么会出现这种差异?

3 个答案:

答案 0 :(得分:2)

根据C ++标准:

  

4.3函数到指针的转换 [conv.func]

     

函数类型T的左值可以转换为类型的prvalue   “指向T”的指针。结果是指向函数的指针。

     

此转换从不适用于非静态成员函数,因为   一个引用非静态成员函数的左值不能   获得。

答案 1 :(得分:0)

我认为差异是因为A::fun是类A的非静态成员。我的意思是,如果你的fun()A的静态成员,那么它就像普通函数一样。试试吧。

答案 2 :(得分:0)

因为现在该功能是在类中定义的。指向成员函数的指针保存函数在类布局中的“相对地址”,因此您必须以这种方式访问​​它。

如果是静态的,它没有这个指针,它的行为就像一个全局函数,因此,你可以像普通函数指针一样访问它。