看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Arim (Arim5566)》之銘言: : 爬了許多文,還是不懂copy constructor為什麼一定要用call by reference : 否則會產生無窮迴圈? : 可以請版友不吝指教一下嗎 謝謝 假設有一 function foo 長成這樣: foo(Bar bar); bar 是 pass-by-value 的. 當有人要 invoke foo() Bar myBar foo(myBar); 進入 foo 之前, 因為是 pass by value, 所以要生成一個 myBar 的 copy. 要怎樣生成呢? compiler 會利用 copy ctor 生成一個 myBar 的複製品, 然後供 foo() 裡面使用. 這裡明白還明白嗎? 把故事放回你的問題: 要是 copy ctor 是 pass-by-value 的話, 比如 Bar myBar; Bar barCopy(myBar); 生成 barCopy 的時候, 因為 myBar 是 pass by value, 所以 compiler 要生成一個 myBar 的複製品 (假設叫 tmpBarA) 才傳進去生成 barCopy. 但生成 tmpBarA, 也是利用 copy ctor, 即是 compiler 是在做 Bar tmpBarA(myBar); 由於是 pass-by-val, 那麼要生成 tmpBarA, 其實傳進去的是 myBar 的一個 複製品 (tmpBarB). 要生成 tmpBarB....... 這樣明白了嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 202.155.236.82
QQ29:請問意思是invoke function就先copy一份 不是因為進去 10/22 21:14
QQ29:foo(Bar bar<=這邊assign嘛?); 10/22 21:16
QQ29:應該說initial@@ 10/22 21:16
QQ29:另外是VC compile就會報錯 說不能寫成傳copy~ 這是VC獨有嘛? 10/22 21:34
VictorTom:推解釋:) 10/22 22:12
Arim:受教了 之前以為copy ctor 的 pass by value 是直接assign給 10/22 22:29
Arim:parameter 10/22 22:30
Arim:那請問pass by reference為什麼就不會有這個問題了呢? 10/22 22:32
james732:pass by ref就不會造成copy的行為 10/22 22:35
dendrobium:assign是不會call copy c'tor 的, 是initialize 10/22 22:35
james732:因此不會再次呼叫copy constructor 自然不會無窮呼叫 10/22 22:36
Arim:所以pass by ref為什麼不會再一次call copy c'tor呢? 10/22 22:38
Arim:這是compiler本身自己的行為嗎? 謝謝 10/22 22:39
nowar100:call by ref 不需要產生暫時的物件阿 10/22 22:45