2013-05-30 131 views
0

我試圖瞭解在此代碼中返回引用的目的是什麼?僅僅是因爲返回引用比複製要快得多,還是有其他更重要的東西?參考返回賦值運算符

class Container 
{ 
    public: 
     int Elems; 
     int * data; 

     Container(int n):Elems(n){data=new int[Elems];} 
     Container operator= (const Container &rhs); 
}; 

Container & Container:: operator= (const Container & rhs) 
{// I deleted the & and I can still compiled and make such things (a=b=c) 
    if(this!=&rhs) 
    { 
     if(data!=NULL) 
       { 
      delete [] data; 
     } 
      Elems=rhs.Elems; 
      data=new int[Elems]; 
      for(int i=0;i<Elems;i++) 
       data[i]=rhs.data[i]; 
    } 

     return *this; 
} 

回答

0

是的,這是爲了避免不必要的副本。但是,在這個特定的類中,它需要正確性,因爲沒有合適的拷貝構造函數。此類的默認複製實例將導致多個實例共享相同的data成員,並可能導致多次刪除。

+0

感謝您的relpy,但我Coult瞭解您的答案的一部分。「默認複製此類的實例將導致多個實例共享相同的數據成員,並且可能會導致多次刪除。我的意思是如果我不能寫&那裏,當我刪除c對象中的部分數據時,它也通過b和一個對象刪除? –

+0

如果你用一個指向已分配內存的成員編寫一個類,則必須小心指針永遠不會泄漏或被雙重刪除。通常這意味着您需要定義析構函數和複製構造函數以及operator =()。如果你沒有定義一個拷貝構造函數(你不這樣做,那是一個賦值函數),那麼你會得到一個默認拷貝構造函數,它可以逐位拷貝對象;那麼你會有兩個對象都指向相同的'數據'數組,最終會導致雙重刪除(或者泄漏,如果沒有刪除數組)。 –

+0

抱歉錯誤的解釋假設有析構函數和複製構造函數,我沒有寫他們,因爲我只是想知道我的代碼的這部分,但你說得對,我應該解釋這一點。 –

0

在C++函數中,簽名不依賴於返回類型,因此在重載時忽略返回值。

在C++ 11之前,返回值而不是引用會導致副本開銷。

+0

在此處返回值必須在C++ 11或更早版本中返回副本。你不能隱式地從'* this'移動,或者不能複製副本。 –