当我需要一个指向类成员的指针时,我会按照以下方式执行
struct MyStruct
{
int foo();
};
int (MyStruct::*p)() = &MyStruct::foo;
我的问题是为什么我需要使用&运算符取地址,如果它是静态函数,则可以忽略该地址。另外,我听说指向成员的指针实际上不是指针,有人可以澄清一下吗?
答案 0 :(得分:6)
如果它是一个静态函数,它就像一个常规的非成员函数指针一样:函数名本身可以隐式转换为函数指针。
如果它是一个非静态成员函数,它就不再是非成员函数了:
this
参数; this
指针。这已经使得无法使用指针来存储指向成员函数的指针。Raymond Chen wrote an interesting article关于此更多细节和示例。
答案 1 :(得分:-2)
为什么我需要使用&运营商采取可能的地址 如果是静态函数则忽略
你是对的,在指向成员函数语法的情况下,理想情况下&
可以省略。我认为,由于历史惯例,&
语法可能。
我听说成员的指针实际上不是指针,有人可以 澄清一下?
这不正确。唯一的区别是它们是指向成员函数的指针。由于class
非静态成员包含隐式 this
指针作为参数,因此它们具有特殊签名。此外,它们不能与具有相同签名的普通函数指针互换。
在您的代码示例中,理论上p
指向:
int MyStruct::foo (MyStruct* const);