其中';这';指针分配 在C++中,这个指针传递给方法作为一个隐藏的参数,它实际上指向当前对象,但是这个指针存储在内存中…在堆栈、堆中,C++中的数据

其中';这';指针分配 在C++中,这个指针传递给方法作为一个隐藏的参数,它实际上指向当前对象,但是这个指针存储在内存中…在堆栈、堆中,C++中的数据,c++,pointers,this,C++,Pointers,This,, > 是“简单”指向当前对象的指针。它允许您访问特定于对象的数据 例如,当类中的代码包含以下代码段时: this->temperature = 40.0f; 它为作用于其上的任何对象设置温度(假设temperature不是类级静态,在类的所有对象之间共享) 这个指针本身不需要分配(就动态内存而言),它完全取决于如何在封面下处理,这是标准实际上并不强制要求的(标准倾向于更多地关注行为而不是内部) 它可以是任意数量的位置:堆栈上、特定内存位置、寄存器中,等等。你所要关心的就是它的行为,基本

,<代码> > <代码>是“简单”指向当前对象的指针。它允许您访问特定于对象的数据

例如,当类中的代码包含以下代码段时:

this->temperature = 40.0f;
它为作用于其上的任何对象设置温度(假设
temperature
不是类级静态,在类的所有对象之间共享)

这个
指针本身不需要分配(就动态内存而言),它完全取决于如何在封面下处理,这是标准实际上并不强制要求的(标准倾向于更多地关注行为而不是内部)

它可以是任意数量的位置:堆栈上、特定内存位置、寄存器中,等等。你所要关心的就是它的行为,基本上就是你如何使用它来访问对象


this
指向的是对象本身,它通常被分配给
new
,用于动态分配,或在堆栈上。

this指针被分配给类函数的堆栈(有时是寄存器)


但是,这不太可能是您实际提出的问题。

此指针位于对象本身*。某种程度上。它是对象的内存位置

如果对象位于堆栈上,则此指针位于堆栈上

如果对象在堆上,则this指针在堆上

总之,这没什么好担心的

*[更新]让我回顾/澄清/更正我的答案。此指针不在对象中的物理属性

我认为这个指针是由编译器派生的,只是存储在符号表中的对象的地址。从语义上讲,它位于对象内部,但这不是OP所要求的

下面是堆栈上3个变量的内存布局。中间的一个是一个对象。你可以看到它只包含一个变量,其他变量都没有:


标准未指定
指针的存储位置

当它在一个成员函数的调用中传递给该函数时,一些编译器在寄存器中传递它,而另一些编译器在堆栈中传递它。它也可以取决于编译器选项

你唯一能确定的是,
这个
是一个基本类型的右值,所以你不能记下它的地址

事情并非总是这样


在标准前C++中,可以分配给<代码> < <代码>,例如,指示构造函数失败。这是在引入例外之前。指示构造失败的现代标准方法是抛出一个异常,这保证了有序的清理(如果没有被用户代码阻止,比如臭名昭著的MFC布局

new
bug)。

假设您的意思是,当调用一个方法时,您的代码如何知道
这个
在哪里。。。它会因许多因素而有所不同,但你当然可以猜测或查看编译器生成的程序集,以获得一个想法。我读到“this”实际上不是指针,它是一个表达式,是真的吗?实际上它的完全重复似乎正是要问的问题。我恐怕答案太模糊了,不适合向上投票。那么,如果我们计算对象的大小,那么我们应该得到实际大小+这个指针的大小,即额外4个字节。。但事实并非如此,我认为它不会出现在sizeof操作符中。根据编译器的不同,指针的大小可以不同。如果你有虚拟函数,还有一个隐藏的函数指针表,它没有显示在sizeof运算符中。但是我们可以看到为指向vTable的虚拟指针分配了额外的4字节。我说这个指针在对象内部的原因是…你能从对象外部访问它吗?说它在对象本身内部是不正确的。它根本不是一个成员变量。如果对象在堆上,那么说它在堆上是完全错误的。