关于指向非静态类成员的指针的说明

Clarification on pointer to non-static class member

本文关键字:指针 说明 成员 静态类 于指      更新时间:2023-10-16

当我需要一个指向类成员的指针时,我做如下操作

struct MyStruct
{
    int foo();
};
int (MyStruct::*p)() = &MyStruct::foo;

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

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

如果它是一个非静态成员函数,它就不再是非成员函数了:

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

Raymond Chen写了一篇有趣的文章,有更多的细节和例子。

为什么我需要使用&接线员要取其中可能的地址如果是静态函数则忽略

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

我听说指向成员的指针并不是真正的指针,有人知道吗澄清了吗?

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

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

int MyStruct::foo (MyStruct* const);