&**这到底是什么回报?

What does &**this return exactly?

本文关键字:回报 是什么      更新时间:2023-10-16

这是一个指向调用对象的指针(它返回r值)。

*这是一个指向调用对象的指针的指针(它返回地址的值)。

**这是指向调用对象(??)的指针的指针。

&***这是对调用对象(??)的指针的指针的指针的引用。

std::vector<int>:: iterator i = vector1.begin();

i是指向它自己的r值的指针(返回它自己的值)。

*i是vector对象的r值指针(返回&value中所指的值)。

**i是指向vector(??)中包含的对象的r值指针的指针。

我真的很困惑。

下面是我们找到表达式&**this的示例代码:

class _Iter
{
private:
    ListElem *pCurr;
    const List *pList;
public:
    _Iter(ListElem *pCurr, const List *list)
        : pCurr_(pCurr), pList(list)
    {}
    T& operator*() { return pCurr_->data; }
    T* operator->() { return &**this; }
};

this是指向当前对象的指针。

*this是对当前对象的引用,即this被解引用。

**this是在当前对象上调用的重载一元operator*函数的返回值。

如果从**this返回的对象有一个重载的operator&()函数,则&**this的求值为(**this).operator&()的返回值。否则,&**this是指向在当前对象上调用的重载一元operator*函数的返回值的指针。

的例子:

#include <iostream>
struct A
{
   int b;
   int a;
   int& operator*() {return a;}
   int* test()
   {
      return &**this;
   }
};
int main()
{
   A a;
   std::cout << "Address of a.a: " << a.test() << std::endl;
   std::cout << "Address of a.a: " << &(*a) << std::endl;
   std::cout << "Address of a.a: " << &(a.a) << std::endl;
   return 0;
}
样本输出:

Address of a.a: 0x7fffbc200754
Address of a.a: 0x7fffbc200754
Address of a.a: 0x7fffbc200754

如果你有一个类Foo和这个类的方法使用this和对象Foo obj,那么

this -是一个类型为pointer to Foo的值,其值为对象obj的地址

所以你可以这样写(例如在Foo:test()中):

Foo *addr = this;

所以addr是一个pointer to Foo类型的变量,它被初始化为Foo类的对象obj的地址值。

c++中的所有指针都可以用*来解引用。当你解引用指向对象的指针时你会得到那个对象

Foo *addr = get_pointer_to(obj); //function that return a pointer to object
//three equivalent ways to call someMethod() of object obj of class Foo
obj.someMethod();
addr->someMethod();
(*addr).someMethod();

代码上半部分说明对象obj和解引用指针(*addr)具有相同的语法,因为它们是相同的对象。

c++允许重载不同的语言操作符。因此,当您编写(**this)时,编译器查找this并发现this是指向Foo的指针类型,因此对*this进行解引用将获得类型为Foo的对象。然后编译器找到(* (*this))。但是Foo不是指针类型,所以默认情况下没有*操作符。因此编译器将返回一个错误并中断编译。但是如果你在类Foo中定义(重载)operator*(),那么编译器将调用这个方法。因此,**this相当于this->operator*()(*this).operator*()

最后一个是operator&()。默认情况下,此操作符返回指向object的指针。当然,它可以被重载并返回其他东西。所以&**this可以返回1)将operator*()返回的对象地址应用于对象(*this)
2)应用于(*this)的operator*()返回的对象的operator&()方法的返回值。

如果没有定义operator*(),则&**this将无法编译。

另外,如果没有定义operator*()operator&(),那么&**some_pointer的构造将不编译或返回(*some_pointer)。我可以保证(*some_pointer)将是一个指针。