2013-04-14 93 views
0

是什麼需要幫助返回參考

什麼是寫在教科書之間的區別認識功能:

MyClass& Myclass::operator++() { 
    do something 
    return *this; 
} 

MyClass Myclass::operator++() { 
    do something 
    return *this; 
} 

*意味着「價值被指出「....

是否是第二個示例將返回由此指向的對象的副本(* this的副本),而第一個示例將返回* this本身?

如果是這種情況,那麼它有什麼不同?提高執行時間?

回答

0

第二個版本將複製MyClass對象(即*this)。第一個將只返回對它的引用。

這不是說任何一個人都是「正確的」 - 而是他們有不同的含義。有時你想克隆一個對象,以便你有兩個(可能)獨立的副本。有時你想共享一個對象。

1

兩者之間的區別在於,在殼體1

即要返回一個恆定指向對象要返回的參考。

在案例2中

要創建一個新的對象,並返回對象

讓我們深入一點了解的東西更好

在案例1

由於您正在返回指向現有對象,你做的任何更改會影響原來的對象

在案例2中

,因爲它的一個副本,則原來的對象

沒有影響來講速度和內存

1的情況下

因爲你返回現有對象的地址不存在或存在小的開銷

在案例2中

要創建一個新的副本......如此構造的對象將被調用,因此在內存和時間方面存在開銷

+1

好傢伙其按下輸入錯誤之前,我甚至可以糾正它,你們做了否定的...無論如何不用擔心:) – Pradheep

0

正如你在答案中已經提到的那樣,第一個返回一個引用,第二個返回一個副本。主要的區別是,語義是完全不同的,考慮:

const auto & r = ++a; 
++a; 
assert(a == r); // true/false depending on what is returned 

在前綴operator++的特定情況下,正確的語義(一,大多數用戶會希望)正在產生的參考。做任何其他事情都會導致混淆,並可能最終成爲源代碼中錯誤的來源。

在更普遍的問題中,如果函數沒有預定義的預期語義,則關於使用的差異仍然是相同的。如果您複製(對於那些副本可能很昂貴的類型),則成本會較高,但如果您需要引用語義,則需要產生引用,如果需要複製語義,則需要返回值no問題是多麼便宜/昂貴。

請注意,關於成本,它可能會比你想象的要小,這取決於你實際在做什麼。如果調用者要使用返回來初始化新對象,則成本可能與RVO將踢入並刪除不必要的額外副本相同。