2011-04-18 272 views
0

拷貝構造函數的想法真的讓我困惑。我不明白他們爲什麼使用引用以及爲什麼在複製構造函數中引用常量?的拷貝構造函數

+0

什麼語言您使用的賈森? – preinheimer 2011-04-18 19:52:28

+1

大概是一個C++的問題。你的C++教科書對這個主題有什麼要說的? – 2011-04-18 19:52:42

+0

[爲什麼複製構造函數應該通過C++引用接受它的參數?](http:// stackoverflow。com/questions/2685854/why-copy-constructor-accept-its-parameter-by-reference-in-c) – 2011-04-18 20:23:30

回答

10

爲什麼使用引用:如果您沒有,則必須創建要複製的對象的副本。那必須用拷貝構造函數來完成。在這裏插入無限循環。

爲什麼一個const引用:你想保證你正在複製的對象沒有被修改。

[編輯]正如他在評論DeadMG狀態,你也想引用是const這樣就可以創建一個臨時實例的副本。例如。假設你有:

class Matrix 
{ 
    Matrix const operator+ (Matrix const & rhs) const; 
    // Code & stuff 
} 

你想返回值是const,這樣愚蠢的事情,如下面的產生編譯錯誤:

Matrix a, b, c; 
(a + b) = c; 

現在很明顯,這是一個愚蠢的說法,但如果返回類型從operator+不是const,它實際上是允許的。當然,在下一行中,臨時(a + b)將超出範圍,您將無法使用它。

然而,正如之前所說的,你要能夠與一個臨時的實例創建一個實例:

Matrix a, b; 
Matrix c(a + b); 

如果參數拷貝構造函數不是const,那是不可能的,因爲operator+的返回類型是const

+2

並且它可以接受對現有C++中臨時對象的引用。 – Puppy 2011-04-18 19:59:17

+0

儘管注意C++ 0x移動語義可能會被你的'operator +'冒充,它返回一個const臨時值。如果'(a + b)'是常量,則不能移動到另一個「矩陣」,只能複製。 「假設」規則可能仍然可以爲您節省昂貴的副本,但IIRC並非在所有情況下。在這方面,移動語義就像在C++ 03中執行'x.swap(a + b)'而不是'x = a + b',但是如果'a + b'是'const',則使用'swap',然後優化不會編譯 - 如果移動分配不可能,則使用移動語義,它會回退到複製分配。 – 2011-04-18 23:42:04

+0

糟糕,我的意思是做'(a + b).swap(x)'而不是'x = a + b'。做'x.swap(a + b)'沒有多大用處,因爲即使非const,'a + b'也不會綁定到非const引用。無論如何,這個要點應該是,即使它是以前的,它不再是「顯而易見的」,因爲'operator +'應該返回一個const對象。 – 2011-04-18 23:48:17

0

一個C++「引用」類型可以簡單地被認爲是一個常量指針,它被初始化爲一個對象的地址值...換句話說,引用永遠不能爲NULL,它必須指向一些目的。因此,它也可以由編譯器隱式地引用到幕後,因此您不必擔心管理指針本身以及關聯的指針語法。

因此,使用複製構造函數時,基本上是將常量指針傳遞給要複製到複製構造函數中的對象......您並未複製該對象本身。如果您確實必須將對象本身複製到臨時對象中,然後由複製構造函數使用它來創建新副本,如前所述,最終會出現無限循環,因爲會將對象複製到臨時對象中對象在第一個地方?另一方面,如果你只是移動一個指針,那麼就不需要複製構造函數來獲得想要複製到複製構造函數中的對象。雖然使用引用語法而不是實際的常量指針,但是因爲1)引用不能爲NULL(如果它是指針語法,我們可以將NULL傳遞給常量指針),並且它的副產品意味着2)很多事情都比較簡單,包括語法,因爲編譯器可以爲您傳入引用指針的隱式解引用,因此您可以使用普通的成員訪問語法,如myclass.member_function()而不是myclass->member_function()

希望這有助於

+0

這看起來像是對一個不同的問題「什麼是參考?」的回答。 – 2011-04-18 20:15:04

+0

我只是試圖說明他們爲什麼要使用引用......換句話說,問題被問到的方式,它似乎也問「爲什麼他們使用引用而不是對象本身?」(或者爲此,爲什麼不是其他類型?)「。如果你首先明白了參考文獻的含義,那麼當使用參考文獻時,推理需要的理由會變得更加清晰。 – Jason 2011-04-18 20:19:12