我了解到this
是一个右值,我们无法通过应用&this
来获取其地址。
在我的代码中,我尝试使用对this
的引用绑定。我想知道哪种方式可以提供this
的地址?还是都错了?
this
到底是什么?左值,右值,关键字或其他内容?
void MyString::test_this() const{
std::cout << "this: " << this << std::endl;
const MyString * const& this_ref = this;
std::cout << "thie_ref: " << &this_ref << std::endl;
const MyString * const&& this_right = this;
std::cout << "thie_right: " << &this_right << std::endl;
}
//this: 00CFFC14
//thie_ref: 00CFFB14
//thie_right: 00CFFAFC
答案 0 :(得分:21)
我想知道哪个可以提供
this
的地址?还是两者都不对?
this
的地址也不是,因为C ++抽象机没有为其定义地址。 this
就像0
。您无法获得地址0,它不是具有存储的实体,只是一些值。那这是做什么的呢?
int const& i = 0;
它将创建一个临时对象,将其初始化为0,然后将引用绑定到该对象。您的代码中发生了同样的事情。您创建对包含this
的 value 的不同临时对象的引用。
this
是一个关键字,代表要为其执行成员函数的对象的地址。 C ++抽象机不需要它占用存储空间,因此它(在逻辑上)始终只是一个简单的值,例如0。
不要求this
占用存储空间是有好处的。它允许在A this
在寄存器中传递(通常无法寻址的东西)的ABI上实现C ++。如果必须&this
进行良好定义,即this
必须是可寻址的,则它将阻止实现使用寄存器来传递地址。 C ++标准通常旨在不将实现捆绑在一起。
答案 1 :(得分:8)
“您不能使用this
的地址”是指您不能写&this
。
您要的是this
指针所代表的地址 ,对吗?这就是您的第一个输出所要做的。
this
本身并未实现为指针,例如MyString* x
将会是。在这里,x
本身在内存中具有位置,您可以执行某项操作。像&x
。对于this
,这是不可能的。
最后一个问题的答案是:是的,this
是一个关键字。表达式this
是主要表达式。您可以在C ++标准的第[expr.prim.this]
节中对此进行阅读。
答案 2 :(得分:4)
this
是一个包含current object
地址的指针。它不是存储在某个位置(甚至可以更改)的变量,而是具有特殊属性的特殊关键字。
如果您想知道“当前对象”的地址,只需在程序中如下所示进行输出:
#include<iostream>
using namespace std;
class Test
{
public:
void fun()
{
cout << "Address of this :: " << this << endl;
void *ptr = this;
cout << "Addrss of ptr :: " << ptr << endl;
}
};
int main()
{
Test obj;
cout << "Address of obj :: " << &obj << endl;
obj.fun();
return 0;
}
上面的程序产生以下输出:
obj的地址:: 0x7fffef913627
此地址的:: 0x7fffef913627
ptr的附加内容:: 0x7fffef913627
希望对您有帮助!
答案 3 :(得分:2)
this
关键字的行为本质上与&__self
相同,其中__self
是一个左值,指定要在其上运行成员函数的对象(*this
对象),但重载除外operator&()
未使用。
因此&this
的意思是&&__self
显然是没有意义的,您不能采用地址的地址,就像您不能采用标量返回值的地址功能:
int fi();
int *fpi();
&(fi())
和&(fpi())
都是非法的,因为返回的右值是一个标量(可能存储在寄存器中),并且因为纯标量值没有地址。