2010-03-11 68 views

回答

17

兩件事情:

  • 拷貝構造函數必須作爲參數引用,否則他們是無限遞歸(其實語言不會允許你聲明這樣的構造函數)

  • 它不會做任何默認拷貝ctor不會做的事情,但做得很糟糕 - 您應儘可能在拷貝ctor中使用初始化列表。如果默認拷貝文件可以做你想要的,不要試圖自己編寫一個版本 - 你可能只會弄錯它,你需要維護它。

+0

+1最完整的答案 – Tronic 2010-03-11 16:15:03

+0

實際上看來,這是一個編譯器錯誤,否則。但是,如果它編譯,它應該是無限遞歸。 – UncleBens 2010-03-11 16:15:26

+0

@Uncle,這樣的「拷貝構造函數」被明確禁止。 (他們要求診斷) – 2010-03-11 16:16:01

7

存在3個問題。

首先,你忘了「;」在m = a.m的末尾,所以你的代碼不會被編譯。

其次,在大多數情況下,如果您傳遞的大小大於您平臺上寄存器的大小 ,則優先通過引用。

第三,由於您不打算更改源對象,因此最好使用const。 所以,最後這就是我們有:

A(const的一個&一):M(AM){}

+0

關於你的第二點:這不是首選,它是必需的。 – 2010-03-11 16:36:17

5

的問題是,拷貝構造函數被調用的參數按值傳遞。所以如果你不想要一個非終止遞歸,你必須通過引用傳遞拷貝構造函數的參數(通常是const引用)。一個小問題是你沒有使用初始化列表,這比初始化成員更可取。修復這兩個問題:

A(A const& a) 
    : m(a.m) 
{} 
+0

謝謝!爲什麼使用初始化列表更好? – Tim 2010-03-11 23:09:38

+0

如果您忽略列表,則賦予初始化列表中的值可以保存無論如何會發生的額外默認初始化。在構造函數的主體中進行賦值時會在初始化的基礎上增加額外的指令。 – BenG 2010-03-12 07:53:25