澄清指向非静态类成员的指针

时间:2011-12-20 06:14:33

标签: c++ pointers language-lawyer pointer-to-member

当我需要一个指向类成员的指针时,我会按照以下方式执行

struct MyStruct
{
    int foo();
};

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

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

2 个答案:

答案 0 :(得分:6)

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

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

  1. 它有一个隐藏的this参数;
  2. 在多继承方案中,将指针转换为其中一个基类可能会产生指向不同地址的指针。这意味着如果继承成员函数,则可能需要在调用之前调整this指针。这已经使得无法使用指针来存储指向成员函数的指针。
  3. Raymond Chen wrote an interesting article关于此更多细节和示例。

答案 1 :(得分:-2)

  

为什么我需要使用&运营商采取可能的地址   如果是静态函数则忽略

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

  

我听说成员的指针实际上不是指针,有人可以   澄清一下?

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

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

int MyStruct::foo (MyStruct* const);