2017-05-25 81 views
1

你好,我有一個類Truck只有一個屬性int類型。我沒有在全班使用任何指針。我已經寫了2個版本的operator=的:轉讓運營商的業績

Truck& operator=(Truck &x) 
    { 
    if(this != &x) 
    {   
     price=x.getPrice(); 
    } 
    return *this; 
    } 

Truck operator=(Truck x) 
    { 
    if(this != &x) 
    {    
     price=x.getPrice();    
    } 
    return *this; 
    } 

他們兩人的工作,但有沒有跟他們任何人任何性能問題?而且,如果我使用指針來聲明我的屬性,我應該堅持第一種類型的聲明嗎?

+0

您應該從[三個規則是什麼?](https:// stackoverflow。COM /問題/ 4172722 /什麼,是最規則的三)。 –

+0

你需要自我分配檢查嗎? –

+0

參考退貨成本幾乎沒有。對象複製返回可能很昂貴。很明顯,不是嗎? – ilotXXI

回答

0

方法1是賦值運算符的有效方式,但建議在此處傳遞常量引用。它返回對this的引用,即一個輕量級指針。

方式2可能會降低性能。它構造並返回this對象的副本。此外,它是無效的。爲什麼賦值運算符中的引用返回是標準簽名?這讓像

copy1 = copy2 = original; 
while ((one = two).condition()) 
    doSomething(); 

表情讓我們考慮以下幾點:

(copy = original).changeObject(); 

有了這種表達方式1就是一個程序員的期望。第二種方法是不正確的:你爲分配操作符返回的臨時對象調用changeObject,而不是copy

你可以說:「我不想用這樣醜陋的語法」。在這種情況下,請不要允許它在operator=中返回任何內容。因此,建議返回對this的引用。

請參閱評論中的鏈接,它們似乎很有用。

1

他們兩人都工作,但他們有沒有任何性能問題 他們?

您發佈的兩個代碼示例都存在潛在的性能問題。

由於你的類只有一個int成員,所以編寫一個用戶定義的賦值運算符,無論它看起來如何寫得好,都可能比編譯器的默認版本要慢。

如果你的類不需要你編寫用戶定義的賦值操作符(或拷貝構造函數),那麼自己編寫這些函數更爲明智,因爲編譯器這些天內在知道如何優化它們自己的例程生成。

與析構函數相同的東西 - 看起來似乎無害的空析構函數幾乎可以看成是一個膝蓋反應,它會影響性能,因爲它再次覆蓋了編譯器的默認析構函數,該函數被優化以執行任何操作需要做的。

因此,底線是當編譯器獨立於這些函數時。如果複製/分配功能的編譯器默認版本足夠,則不要通過編寫自己的版本來進行干預。有可能編寫錯誤的東西(比如遺漏你可能無法複製的成員),或者做比編譯器產生的效率低的東西。