嗨我有一个关于this指针的问题,当一个对象被构造时,它何时被初始化?这意味着什么时候可以使用它?虚构表是在构造函数中构造的,与this指针一样吗?
例如,我有一个像这样的代码.输出是8.是否意味着在输入构造函数之前,this指针已经初始化了?
class A{
public:
A() { cout<<sizeof(*this);}
int i;
int *p;
};
int main() {
A a;
}
Run Code Online (Sandbox Code Playgroud)
如果是,那么在输入构造函数之前还会发生什么?
如果不是,this指针何时初始化?
Ste*_*314 14
该this指针不是对象或类的成员-这是为您调用该方法的隐含参数.因此它的传递方式与其他任何参数一样 - 除了你不直接要求它.
在上面的示例中,构造函数是一种特殊方法,它又是一种特殊的函数.构造对象时,编译器为它分配内存(在这种情况下在堆栈中,就像a函数中的局部变量一样main.然后它会自动调用构造函数来初始化对象.
作为调用构造函数的一部分,隐式参数this- 指向对象的指针 - 作为参数传入.
在具有以下签名的方法中......
void MyMethod (const int* p) const;
Run Code Online (Sandbox Code Playgroud)
实际上有两个参数,都是指针.有显式参数p和隐含参数this.该const行的末尾指定这this是一个const指针,就像前面指定的那样p是一个const指针.仅存在对该特殊语法的需要,因为它this是隐式传递的,因此您不能像其他参数那样以正常方式指定const-ness.
"静态"方法没有隐含的"this"参数,也不能直接访问对象成员 - 可能没有与调用关联的特定对象.它基本上是一个标准函数而不是一个方法,除了访问私有成员(假设它可以找到一个要访问的对象).
正如Steve Fallows指出的那样,sizeof (this)在编译时已知,因为它是一个指针类型,所有指针(*1)都具有相同的sizeof值.您看到的"8"表示您正在为64位平台进行编译.this此时可用 - 它指向有效的内存,并且所有成员都已完成构造函数调用.但是,它不一定完全初始化 - 毕竟你仍然在构造函数调用中.
编辑
*1 - 严格来说,这可能不是真的 - 但编译器知道它在这里处理的指针类型,即使该值在运行时才知道.
该this指针不存储.当为占用特定内存位置的对象调用构造函数时,该位置将作为参数传递给构造函数和其他成员函数.
如果this将存储在对象内,如何检索该指针?对,你再次需要this指针:)