2013-12-17 14 views
-1

在C Concering語法++Keword這 - 類成員reffering到自身

關鍵字是指向所述對象(類)本身,並把一個*提前此相同derefferencing指針。

所以我們說,班裏有一個私有成員

private: 
int a = 10; 

我創建的語法如下:

(*this).a = obj.a; 

可能超載「=」操作

時,可以使用例如

它看起來有點奇怪,因爲它似乎是類成員「a」是指自己 - 但它是一個有效的語法!

然後我的問題是 - 如果聲明是有效的 - 爲什麼可能人們不把它寫在下列方式:

obj.a = obj.a; 

???

我得到Eclipse中以下錯誤:

分配TI本身

+0

'obj.a = obj.a'是自我分配。它沒有任何魔力,就像試圖將水從一塊玻璃移到同一塊玻璃:)。編譯器不會抱怨,如果你會嘗試這樣做。 – Raxvan

+0

是顯示錯誤還是警告? –

回答

4

嚴格來說,自我分配並不違法。 Eclipse只是警告你,因爲這是一件愚蠢的事情。它應該肯定是而不是正在做的是錯誤,因爲它不是錯誤。在這種情況下,您只是針對Eclipse使用的任何靜態分析器的限制運行,而無法確定它是否是同一事物,而obj.a顯然與obj.a相同。

2
obj.a = obj.a; 

Eclipse是警告你約一個明顯的自我分配。

(*this).a = obj.a; 

通常,*this是不一樣的實例作爲obj,並且如果是,則這可能變得僅在運行時顯而易見。因此,Eclipse的靜態分析器在這種情況下不會發出警告。

還要注意的是,你不需要this

a = obj.a; 

就可以了。

2

你可以這樣寫。它是有效的C++。 Eclipse只是指出這是無用的事情。對任意表達式(如*(this).a)自動檢測此值只是超出其功能範圍。這是因爲它不能爲所有程序完成。

例如:

void T::foo(T& other) 
{ 
    T* ptr = nullptr; 
    if (rand()) 
     ptr = this; 
    else 
     ptr = &other; 

    T& obj = *ptr; 
    this->a = obj.a; // cannot be optimised out 
} 

但是,在其他情況下,理論上一個完整的C++解析引擎能做到這一點就像你的編譯器的優化器可以。

例如:

void T::foo() 
{ 
    T& obj = *this; 
    this->a = obj.a; // can easily be optimised out 
} 

有編寫代碼的小點在IDE /智能感知,試圖弄清楚了這些案件;這只是不值得。所以它不嘗試。

+1

@jogojapan:嗯,是的,在這種情況下,這是不可能的。但是有一些情況並非如此,就像編譯器的優化器能夠發現這些情況一樣。例如,'T&obj = * this; this-> a = obj.a;' –