2014-10-08 103 views
2

很新的C++。我看到人們通常在運算符重載中通過引用傳遞對象。那麼,我無法弄清楚什麼時候真的有必要。如下面的代碼所示,如​​果我在operator +中聲明瞭對象c1和c2時刪除了&符號,我仍然會得到相同的結果。在這種情況下,當我們不想修改c1或c2時,是否有任何理由要通過引用?通過引用傳遞一個對象重載運算符 - C++

#include <iostream> 

class Keys 
{ 
private: 
    int m_nKeys; 

public: 
    Keys(int nKeys) { m_nKeys = nKeys; } 

    friend Keys operator+(const Keys &c1, const Keys &c2); 

    int GetKeys() { return m_nKeys; } 
}; 


Keys operator+(const Keys &c1, const Keys &c2) 
{ 
    return Keys(c1.m_nKeys + c2.m_nKeys); 
} 

int main() 
{ 
    Keys cKeys1(6); 
    Keys cKeys2(8); 
    Keys cKeysSum = cKeys1 + cKeys2; 
    std::cout << "There are " << cKeysSum.GetKeys() << " Keys." << std::endl; 
    system("PAUSE"); 
    return 0; 
} 
+0

如果不通過引用傳遞對象(或由指針)作爲參數,可以通過值將它們傳遞,這意味着它們被複制;一些對象的複製可能很昂貴。 – piwi 2014-10-08 07:40:04

+0

那麼你刪除了需要複製的對象作爲params的一件事,如果你採取一個參考,所以它可能會更有效率將參數作爲參考 – EdChum 2014-10-08 07:40:12

回答

2

運營商們就像普通的功能,只需用「花哨」的名字:)(以下EG operator+()代替sum()

所以,您應用於功能相同的參數傳遞規則,可以適用於重載運營商也是如此。

特別是,當你有一個參數,該參數是不便宜複製(例如int,一個float,都是廉價複製參數的例子;一個std::vector,一個std::string,都是例子廉價複製參數),和你觀察這個參數的方法內(即它是一個輸入只讀參數),那麼你可以傳通過const引用(const &)

這樣,基本上它就像原始的參數的地址被傳遞給函數,所以沒有深拷貝參與。深拷貝可能非常昂貴,例如想象一個具有大量元素的矢量。

因此,回顧一下,你路過const引用時:

  1. 參數僅僅是不便宜複製(如整型,浮點等只是 不打擾:路過值只是細)
  2. 所述參數是在的功能/操作者執行 觀察(即它是一個輸入端只讀參數)
+0

@ Mr.C64現在在'ostream&operator <<(ostream&out,Something) { \t out << Something << endl; \t退貨; }'ostream後的功能是什麼? – QuestionMark 2014-10-08 17:55:33

+0

@Farzin:由於'out'是一個_modifiable_參數,所以使用'&',它不是一個只讀輸入參數。基本上,「out」是對你要附加自己文本的流的引用。這個操作_modifications_流對象,所以你不能通過'const'引用傳遞它,你必須刪除這個const。 – 2014-10-09 09:32:13

+0

@ Mr.C64:我的意思是'&ostream&operator'。 – QuestionMark 2014-10-09 13:46:11

3

如果你通過引用傳遞,那麼沒有對象的副本,對於更復雜的類可以大大提高性能。

在這種情況下,性能成本可能是微乎其微的,可以想象編譯器可以全面優化它,但仍然值得一試。之後Keys類可能會變成更復雜的東西。

0

考慮一個vectorlong其中有1000萬個條目。如果原型的功能,如:

void foo(vector<long> vl) 
{ 
} 

這將導致賦值運算符(或複製構造函數)的vector<long> - 這將需要複製所有這些10米元素。此臨時對象的後續析構函數(vl)將取消分配內存並執行其他清理。這肯定會影響性能

有類,特別是周圍的同步提供者(臨界區等),以及防止拷貝構造和/或賦值操作符的一些智能指針類 - 讓轉讓或對象創建沒有按不會發生錯誤。雖然可以實現移動構造函數或移動賦值運算符。

0

優點通過由參考:

  1. 它使我們能夠具有的功能改變參數,有時它是有用的值。
  2. 因爲沒有創建參數副本,所以即使與大型結構體或類一起使用時也是快速的。
  3. 我們可以通過const引用來避免無意的更改。
  4. 我們可以從一個函數返回多個值。
  5. 傳球

缺點通過引用:

  1. 是,由於非const引用不能以文字或表達製成,參考參數必須是正常的變量。
  2. 可能很難判斷通過引用傳遞的參數是輸入輸出還是兩者。
  3. 從函數調用中不可能發現參數可能會改變。通過值傳遞並通過引用傳遞的參數看起來是相同的。我們只能通過查看函數聲明來判斷參數是通過值還是引用傳遞的。這可能會導致程序員沒有意識到函數會改變參數值的情況。
  4. 因爲引用通常由C++使用指針來實現,而取消引用指針比直接訪問指針要慢,所以訪問通過引用傳遞的值比訪問通過值傳遞的值要慢。

可以讀取下面:

http://www.cs.fsu.edu/~myers/c++/notes/references.html