指向类成员的指针

Pointer to a member of class

本文关键字:指针 成员      更新时间:2023-10-16

在我的类中,如果我想指向类的一个成员,

struct S
{
     static int get();
     int do_something();
     int x;
};

我知道,

int (*p)() = S::get;

不幸的是,这不适用于非静态成员

int (*p)() = S::do_something; // error

既然,静态成员函数是一个普通函数,我在下面引用了一句话,说非静态成员函数也是一个普通的函数,为什么它不起作用呢?这是什么意思?

(9.2/10([注意:非静态成员函数的类型是普通的函数类型,而非静态数据成员的类型是普通的对象类型。没有特殊的成员函数类型或数据成员类型。]

非静态成员函数是而不是普通函数。您无法形成指向它们的自由指针。

引用非静态成员函数的唯一允许方式是通过实例指针/引用和指向成员函数的指针的

S * p = &theobject;
int (S::*ptmf)() = &S::do_something;
return (p->*ptmf)();

与成员对象(你可以很好地形成一个自由指针,例如&theobject.x(不同,成员函数更复杂,因为你需要考虑虚拟函数:如果S是一个多态基类,p是一个指向基类的指针,do_something()是虚拟的,那么上面的例子应该执行正确类型的调度。一个简单的自由函数指针无法做到这一点。

(此外,标准没有指定成员函数的每个底层实现是如何实现的,所以这个细节永远不会向用户公开。通常它会是类似int S_mangled_name_do_something(S *);的东西,但没有指定。(

以下是我关于这个问题的一些相关答案:#1,#2。

函数的类型是普通的,而不是函数指针的类型。指向非静态成员函数的指针必须这样声明:

typedef int (S::*p)() ptr_to_member_of_s;
int (S::*p)() = S::do_something;

非静态成员函数是一个普通函数,除了有一个不可见的参数this。