繁体   English   中英

什么&**这个回归到底是什么?

[英]What does &**this return exactly?

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

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

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

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

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

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

* i是向量中包含的对象的r值的指针(返回&value中指向的值)。

** i是指向包含在向量(???)中的对象的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的类型pointer to Foo的值,其值为object obj的地址

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

Foo *addr = this;

所以addr是一个pointer to Foo的类型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*()应用于对象的operator*()返回的对象的地址(* this)
2)返回operator&() operator*()返回的对象的方法operator&()的值,该值被应用于(* this)。

如果没有定义operator*()那么&**this将不会编译。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM