是否可以获取“ this”指针的地址?

时间:2019-07-01 09:16:32

标签: c++ reference this rvalue-reference rvalue

我了解到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

4 个答案:

答案 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())都是非法的,因为返回的右值是一个标量(可能存储在寄存器中),并且因为纯标量值没有地址