带有指向成员函数的指针的地址运算符

Address operator with pointer to member function

本文关键字:指针 地址 运算符 函数 成员      更新时间:2023-10-16

我们知道,要创建一个指向函数的"公共"指针,我们可以执行以下操作:

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

的名称也是函数开始的地址。所以我不需要使用地址运算符,就像这样:

void (*ptr)() = &fun;

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

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

为什么会有这种差异?

根据C++标准:

4.3 函数到指针的转换

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

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

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

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

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