Ran*_*Hao 16 c++ reference this rvalue rvalue-reference
我读到这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
Run Code Online (Sandbox Code Playgroud)
Sto*_*ica 21
我想知道哪个地址可以给
this?还是两者都不对?
的地址也不是this,因为C ++抽象机未为其定义地址。this就像0。您无法获得地址0,它不是具有存储的实体,只是一些值。那么,这是做什么的呢?
int const& i = 0;
Run Code Online (Sandbox Code Playgroud)
它创建一个临时对象,将其初始化为0,然后将引用绑定到该对象。您的代码中发生了同样的事情。您创建了对包含的值的不同临时对象的引用this。
this是一个关键字,代表要为其执行成员函数的对象的地址。C ++抽象机不需要它占用存储空间,因此它(在逻辑上)始终只是一个简单的值,例如0。
不需要this占用存储空间是有好处的。它允许C ++在ABI上实现,在ABI this中将其传递到寄存器中(通常无法寻址)。如果&this必须定义明确,即this必须可寻址,则它将阻止实现使用寄存器来传递地址。C ++标准通常旨在不将实现捆绑在一起。
“您不能使用地址this”的意思是,您不能写&this。
您要的是指针所代表的地址this,对吗?这就是您的第一个输出所做的。
this本身并不像指针那样实现为指针MyString* x。在这里,x它本身在内存中有一个位置,您可以做某事。喜欢&x。这是不可能的this。
您最后一个问题的答案是:是的,this是一个关键字。该表达式this是主要表达式。您可以[expr.prim.this]在C ++标准的部分中阅读有关它的信息。
小智 5
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;
}
Run Code Online (Sandbox Code Playgroud)
以上程序产生以下输出:
obj 的地址 :: 0x7ffef913627
这个地址:: 0x7ffef913627
ptr 的地址 :: 0x7ffef913627
我希望它有帮助!
| 归档时间: |
|
| 查看次数: |
1083 次 |
| 最近记录: |