gpt4 book ai didi

c++ - 什么时候在 C++ 中初始化 "this"指针?

转载 作者:IT老高 更新时间:2023-10-28 23:11:01 25 4
gpt4 key购买 nike

您好,我有一个关于 this 指针的问题,什么时候构造一个对象,什么时候初始化它?这意味着,我什么时候可以使用它?虚表是在构造函数中构造的,和this指针一样吗?

例如,我有一个这样的代码。输出为8,是否表示在进入构造函数之前,this指针已经初始化?

class A{
public:
A() { cout<<sizeof(*this);}
int i;
int *p;
};

int main() {
A a;
}

如果是真的,在进入构造函数之前还会发生什么?

如果不是真的,this指针是什么时候初始化的?

最佳答案

this 指针不是对象或类的成员 - 它是您调用的方法的隐式参数。因此,它的传递与任何其他参数非常相似 - 除了您不直接要求它。

在你上面的例子中,构造函数是一种特殊的方法,它又是一种特殊的函数。当您构造对象时,编译器会为其分配内存(在本例中是在堆栈上,因为 amain 函数中的局部变量。然后它会自动调用构造函数来初始化对象。

作为调用构造函数的一部分,隐式参数 this - 指向您的对象的指针 - 作为参数传入。

在具有以下签名的方法中...

void MyMethod (const int* p) const;

实际上有两个参数,都是指针。有显式参数p 和隐式参数this。行尾的 const 指定 this 是一个 const 指针,就像前面指定 p 是一个 const 指针一样。之所以需要这种特殊语法,是因为 this 是隐式传递的,因此您不能像使用其他参数一样以正常方式指定 const-ness。

“静态”方法没有隐含的“this”参数,也不能直接访问对象成员 - 可能没有与调用关联的特定对象。它基本上是一个标准函数而不是一个方法,除了可以访问私有(private)成员(前提是它可以找到要访问的对象)。

正如 Steve Fallows 指出的那样,sizeof (this) 在编译时是已知的,因为它是一种指针类型并且所有指针 (*1) 都具有相同的 sizeof 值(value)。您看到的“8”表示您正在为 64 位平台进行编译。 this 此时可用 - 它指向有效内存,并且所有成员都已完成其构造函数调用。但是,它不一定完全初始化 - 毕竟你仍然在构造函数调用中。

编辑

*1 - 严格来说,这可能不是真的 - 但编译器知道它在这里处理的是什么类型的指针,即使值直到运行时才知道。

关于c++ - 什么时候在 C++ 中初始化 "this"指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2483679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com