[英]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.