是否可以获得'this'指针的地址?
Is it possible to obtain the address of the 'this' pointer?
我读到 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
"you cannot take the address of this
"的意思是,你不能写&this
。
您要的是由this
指针表示的地址,对吗?这就是您的第一个输出的作用。
this
本身并没有具体化为指针,例如MyString* x
会。在这里,x
本身在内存中有一个位置,你可以做某事。喜欢 &x
。这对于 this
.
是不可能的
您最后一个问题的答案是:是的,this
是关键字。表达式 this
是一个基本表达式。您可以在 C++ 标准的 [expr.prim.this]
节中阅读它。
I'm wondering which may give the address of this
? Or both are wrong?
this
的地址也不是,因为C++抽象机没有为它定义地址。 this
就像 0
。你不能得到 0 的地址,它不是一个有存储的实体,只是一些值。那么这有什么作用呢?
int const& i = 0;
它创建一个临时对象,用 0 初始化它,然后将引用绑定到它。您的代码中发生了同样的事情。您创建对不同临时对象的引用,这些临时对象包含 this
.
的 value
this
是一个关键字,代表成员函数正在执行的对象的地址。 C++ 抽象机不需要它占用存储空间,所以它总是(逻辑上)只是一个普通值,比如 0.
不需要 this
占用存储空间是有好处的。它允许通过 ABI 实现 C++,其中 this
在寄存器中传递(通常无法寻址的东西)。如果 &this
必须是 well-defined,即如果 this
必须是可寻址的,它将阻止实现使用寄存器来传递地址。 C++ 标准通常旨在不将实现捆绑在一起。
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;
}
以上程序产生以下输出:
Address of obj :: 0x7fffef913627
Address of this :: 0x7fffef913627
Addrss of ptr :: 0x7fffef913627
希望对您有所帮助!
this
关键字的行为本质上与 &__self
相同,其中 __self
是一个左值,指定成员函数所在的对象 运行(*this
object) 除了不使用重载的 operator&()
。
所以 &this
意味着 &&__self
这显然没有意义,你不能获取地址的地址,就像你不能获取标量的地址一样 return 函数值:
int fi();
int *fpi();
&(fi())
和 &(fpi())
都是非法的,因为右值 returned 是标量(可能存储在寄存器中)而 作为纯标量值没有地址.
我读到 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
"you cannot take the address of this
"的意思是,你不能写&this
。
您要的是由this
指针表示的地址,对吗?这就是您的第一个输出的作用。
this
本身并没有具体化为指针,例如MyString* x
会。在这里,x
本身在内存中有一个位置,你可以做某事。喜欢 &x
。这对于 this
.
您最后一个问题的答案是:是的,this
是关键字。表达式 this
是一个基本表达式。您可以在 C++ 标准的 [expr.prim.this]
节中阅读它。
I'm wondering which may give the address of
this
? Or both are wrong?
this
的地址也不是,因为C++抽象机没有为它定义地址。 this
就像 0
。你不能得到 0 的地址,它不是一个有存储的实体,只是一些值。那么这有什么作用呢?
int const& i = 0;
它创建一个临时对象,用 0 初始化它,然后将引用绑定到它。您的代码中发生了同样的事情。您创建对不同临时对象的引用,这些临时对象包含 this
.
this
是一个关键字,代表成员函数正在执行的对象的地址。 C++ 抽象机不需要它占用存储空间,所以它总是(逻辑上)只是一个普通值,比如 0.
不需要 this
占用存储空间是有好处的。它允许通过 ABI 实现 C++,其中 this
在寄存器中传递(通常无法寻址的东西)。如果 &this
必须是 well-defined,即如果 this
必须是可寻址的,它将阻止实现使用寄存器来传递地址。 C++ 标准通常旨在不将实现捆绑在一起。
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;
}
以上程序产生以下输出:
Address of obj :: 0x7fffef913627
Address of this :: 0x7fffef913627
Addrss of ptr :: 0x7fffef913627
希望对您有所帮助!
this
关键字的行为本质上与 &__self
相同,其中 __self
是一个左值,指定成员函数所在的对象 运行(*this
object) 除了不使用重载的 operator&()
。
所以 &this
意味着 &&__self
这显然没有意义,你不能获取地址的地址,就像你不能获取标量的地址一样 return 函数值:
int fi();
int *fpi();
&(fi())
和 &(fpi())
都是非法的,因为右值 returned 是标量(可能存储在寄存器中)而 作为纯标量值没有地址.