this
指针不是对象或类的成员 - 它是您调用的方法的隐式参数。因此,它的传递方式与其他参数非常相似 - 除非您不直接询问它。
在上例中,构造函数是一种特殊的方法,它又是一种特殊的函数。当你构造对象,编译器分配它的内存(在这种情况下,在栈上,如a
在main
函数的局部变量。然后,它会自动调用构造函数初始化对象。
作为调用的一部分构造函数,隐参数this
- 一个指向你的对象 - 传递作为参数
在具有以下签名的方法...
void MyMethod (const int* p) const;
其实有两个参数,两个指针。 。有显式参数p
和隐式参数this
。该行末尾的const
指定this
是一个常量指针,与前面的指定p
是一个常量指针一样。因为this
是隐式传递的,所以只能存在对这种特殊语法的需求,所以不能像其他参数那样以常规方式指定常量。
“静态”方法没有隐含的“this”参数,并且无法直接访问对象成员 - 可能没有与该调用关联的特定对象。它基本上是一个标准函数,而不是一个方法,除了访问私有成员(提供它可以找到一个要访问的对象)。
正如Steve Fallows指出的那样,sizeof (this)
在编译时是已知的,因为它是一个指针类型,所有指针(* 1)具有相同的sizeof
值。你看到的“8”意味着你正在编译一个64位平台。this
此时可用 - 它指向有效内存,并且所有成员都已完成其构造函数调用。但是,它不一定是完全初始化的 - 毕竟你仍然在构造函数中。
编辑
* 1 - 严格,这可能不是真的 - 但是编译器知道它在这里处理什么类型的指针与即使该值直到运行时才知道。
编译器知道* this的大小,它会生成一个硬编码的值。也许你需要一个更好的例子。 – 2010-03-20 15:57:34
sizeof是编译时的东西(我不会说硬编码),并且不依赖于运行时“this”指针中包含的值。另外,vtable(应该有一个)不是“在构造函数中”构造的。 Neil: – 2010-03-20 16:02:33
:真的吗?如果不是int构造函数,那是什么? – skydoor 2010-03-20 16:12:25