2014-03-13 60 views
11

這是一個指向調用對象的指針(它返回r值)。&**完全返回?

*這是一個指向調用對象指針的指針(它返回地址的值)。

**這是一個指向調用對象(???)指針指針的指針。

& ***這是對調用對象(???)的指針的指針指針的引用。

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

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

* i是包含在向量中的對象的r值的指針(返回&值中指出的值)。

** i是指向包含在向量(???)中的對象的r值指針的指針。

我真的很困惑。

這裏我們找到了表達& **此示例代碼:

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; } 
}; 
+0

調用者獲取'&pCurr-> data'。 –

+1

你必須記住'*'完全是向後的,取決於它是在聲明還是在可執行語句中。 –

+0

「這是一個指向調用對象的指針(它返回r值)」命名變量不能是r值 –

回答

20

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 
+7

看看這是否會使它更清晰(或更令人困惑): '** this'可以解釋爲'this - > operator *()'。因此'&** this'是'&(this-> operator *())',它取當前對象的重載'*'運算符的返回值的地址:P –

+1

'&** this'''運算符&'調用一元運算符*'的返回值。事實上,如果'operator *'返回一個非引用,那麼它必須是,因爲你不能獲取臨時地址。 –

+0

@MattMcNabb,優點。 –

2

如果有一個類Foo和這個類使用this的方法和對象Foo obj然後

this - 是類型爲pointer to Foo的值,其值爲對象的地址obj

這樣你就可以像這樣寫(例如,在富:測試()):

Foo *addr = this; 

所以addr是與Foo類的對象obj的地址值進行初始化pointer to Foo類型的變量。

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&()。該運算符默認返回一個指向對象的指針。但它當然可以被重載並返回其他東西。 所以&**this可以返回 1),通過operator*()應用於對象(*此)
2),將其施加到(*此,是由operator*()返回的對象的方法operator&()的返回值返回的對象的地址) 。

如果沒有operator*()定義,那麼&**this將不會編譯。

另外,如果沒有定義operator*()並且沒有定義operator&()那麼&**some_pointer的構造將不會編譯或將返回(* some_pointer)。我可以保證(* some_pointer)將成爲一個指針。

相關問題