当我需要指向类成员的指针时,我执行以下操作
struct MyStruct
{
int foo();
};
int (MyStruct::*p)() = &MyStruct::foo;
我的问题是为什么我需要使用 & 运算符来获取如果它是静态函数可能会被忽略的地址。另外,我听说指向成员的指针并不是真正的指针,有人可以澄清一下吗?
当我需要指向类成员的指针时,我执行以下操作
struct MyStruct
{
int foo();
};
int (MyStruct::*p)() = &MyStruct::foo;
我的问题是为什么我需要使用 & 运算符来获取如果它是静态函数可能会被忽略的地址。另外,我听说指向成员的指针并不是真正的指针,有人可以澄清一下吗?
如果它是一个静态函数,它就像一个常规的非成员函数指针一样工作:函数名本身可以隐式转换为函数指针。
如果是非静态成员函数,就不再和非成员函数是一回事了:
this
参数;this
在调用之前可能需要调整指针。这已经使得不可能使用指针来存储指向成员函数的指针。Raymond Chen写了一篇有趣的文章,其中包含更多细节和示例。
为什么我需要使用 & 运算符来获取如果它是静态函数可能会被忽略的地址
你是对的,在指向成员函数的指针的情况下,理想情况下&
可以省略语法。我认为,&
语法可能是由于历史惯例。
我听说指向成员的指针并不是真正的指针,有人可以澄清一下吗?
这是不正确的。唯一的区别是它们是指向成员函数的指针。由于class
非静态成员包含一个隐式 this
指针作为其参数,因此它们具有特殊的签名。此外,它们不能与具有相同签名的普通函数指针相互转换。
在您的代码示例中,理论上p
指向:
int MyStruct::foo (MyStruct* const);