3

当我需要指向类成员的指针时,我执行以下操作

struct MyStruct
{
    int foo();
};

int (MyStruct::*p)() = &MyStruct::foo;

我的问题是为什么我需要使用 & 运算符来获取如果它是静态函数可能会被忽略的地址。另外,我听说指向成员的指针并不是真正的指针,有人可以澄清一下吗?

4

2 回答 2

6

如果它是一个静态函数,它就像一个常规的非成员函数指针一样工作:函数名本身可以隐式转换为函数指针。

如果是非静态成员函数,就不再和非成员函数是一回事了:

  1. 它有一个隐藏this参数;
  2. 在多继承场景中,将指针转换为基类之一可能会产生指向不同地址的指针。这意味着如果成员函数是继承的,那么this在调用之前可能需要调整指针。这已经使得不可能使用指针来存储指向成员函数的指针。

Raymond Chen写了一篇有趣的文章,其中包含更多细节和示例。

于 2011-12-20T06:32:17.030 回答
-2

为什么我需要使用 & 运算符来获取如果它是静态函数可能会被忽略的地址

你是对的,在指向成员函数的指针的情况下,理想情况下&可以省略语法。我认为,&语法可能是由于历史惯例。

我听说指向成员的指针并不是真正的指针,有人可以澄清一下吗?

这是不正确的。唯一的区别是它们是指向成员函数的指针。由于class非静态成员包含一个隐式 this指针作为其参数,因此它们具有特殊的签名。此外,它们不能与具有相同签名的普通函数指针相互转换。

在您的代码示例中,理论上p指向:

int MyStruct::foo (MyStruct* const);
于 2011-12-20T06:39:14.293 回答