指针不与指向成员的this
指针一起存储(成员函数指针是这种情况的特例)。如果你只是这样做
void (MyObject::*f)( int, int ) = &MyObject::method_that_takes_two_ints;
那么存储的只是您以后必须提供的对象上应该调用哪个成员函数的信息。如果你想调用它,你必须传递一个对象,编译器将从那里获取this
指针。
MyObject o; (o.*f)(1, 2);
成员函数指针只是一个成员指针,其类型(指向)是函数类型。标准说成员函数指针没有它们自己指向的“成员函数类型”,并且会以某种方式包含 this 指针类型。
int main() {
typedef void fun() const;
fun MyObject::*mem_function_ptr =
&MyObject::const_method_that_takes_two_ints;
}
fun
在该代码中是函数类型。“正常”函数具有的类型。与成员函数指针相反,指向函数的指针只是指向具有该类型的函数的指针:
void foo() { cout << "hello"; }
int main() {
typedef void fun();
fun * f = &foo;
}
而指向成员函数的指针在该函数类型之上具有附加的成员指针级别。
关于this
指针的一些事情以及它与它指向的对象的关系(不是技术性的,只是理论上的东西):
每个成员函数都有一个隐藏参数,称为 ,implicit object parameter
它具有类型MyObject&
或MyObject const&
取决于您是否具有 const 或非常量成员函数。您在 上调用成员函数的对象o
是implied object argument
,它被传递给参数。在构成描述如何调用成员函数的规则的标准理论中,隐式对象参数是第一个隐藏参数。这是概念性的,并不意味着它是实现中的真实案例。隐含对象参数然后绑定到该隐含对象参数,可能导致隐式转换(因此,如果您在非常量对象上调用 const 成员函数,则限定转换将从转换MyObject
为MyObject const&
. 对于非常量对象,这就是使非常量函数比调用 const 函数更好的选择的原因)。例如,可以在这段代码中说:
struct A {
operator int() const { return 0; }
};
int main() {
A a;
int i = a; // implicit conversion using the conversion function
}
type 的隐含对象参数绑定到a
type的隐含对象参数,然后具有此处类型的指针指向其对象。需要注意的重要一点是,隐式对象参数只是一个理论构造,用于形式化调用成员函数的规则是如何构成的(构造函数不包括它们),而 this 指针实际上是存在的。是一个指针,因为在引入的时候,C++ 还没有引用。A
A const&
this
A const*
this
this
我希望这能帮助你理解这个问题。