this
指针不是沿着指向成员的指针存储的(成员函数指针是这种情况的特例)。如果你只是做
void (MyObject::*f)(int, int) = &MyObject::method_that_takes_two_ints;
然后存储的只是成员函数应该在objet上调用,你稍后必须提供的信息。如果你想调用它,你必须传递一个对象,其中编译器会从中获取指针this
。
MyObject o; (o.*f)(1, 2);
一个成员函数指针仅仅是一个成员指针,其类型(这是指出)是一个函数类型。该标准说,成员函数指针没有它们自己指向的“成员函数类型”,并且会以某种方式包含此指针类型。
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或nonconst成员函数。您调用成员函数o
的对象是implied object argument
,它被传递给参数。在构成描述如何调用成员函数的规则的标准理论中,隐式对象参数是第一个隐藏参数。这是概念性的,并不意味着它是实现中的真实案例。然后将隐含的对象参数绑定到该隐式对象参数上,可能导致隐式转换(因此,如果您在非const对象上调用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
时,C++还没有引用。
我希望能帮助你理解这件事。
令人印象深刻的答案。 – mahesh 2009-03-06 07:09:11