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 或非const 成员函数。您调用成员函数o 的对象是implied object argument,它被传递给参数。在构成描述如何调用成员函数的规则的标准理论中,隐式对象参数是第一个隐藏参数。这是概念性的,并不意味着它是实现中的真实案例。然后将隐含的对象参数绑定到该隐式对象参数,这可能会导致隐式转换(因此,如果您在非常量对象上调用 const 成员函数,则限定转换将从 MyObject 转换为 MyObject const&。这就是对于非 const 对象,非 const 函数比调用 const 函数更好)。例如,可以在这段代码中说:
struct A {
operator int() const { return 0; }
};
int main() {
A a;
int i = a; // implicit conversion using the conversion function
}
A 类型的隐含对象参数a 绑定到A const& 类型的隐含对象参数,然后这里的this 类型为A const* 的指针指向其对象。需要注意的重要一点是,隐式对象参数只是一个理论构造,用于形式化调用成员函数的规则是如何构成的(构造函数不包括它们),而 this 指针实际上是存在的。 this 是一个指针,因为在引入this 时,C++ 还没有引用。
我希望这能帮助你理解这个问题。