簡體   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