何时在C++中初始化"this"指针?

sky*_*oor 12 c++

嗨我有一个关于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 - 严格来说,这可能不是真的 - 但编译器知道它在这里处理的指针类型,即使该值在运行时才知道.


Joh*_*itb 7

this指针不存储.当为占用特定内存位置的对象调用构造函数时,该位置将作为参数传递给构造函数和其他成员函数.

如果this将存储在对象内,如何检索该指针?对,你再次需要this指针:)