Re: [問題] copy constructor

看板C_and_CPP作者 (Alien)時間16年前 (2009/10/22 21:11), 編輯推噓5(509)
留言14則, 6人參與, 最新討論串2/5 (看更多)
※ 引述《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

10/22 21:14, , 1F
請問意思是invoke function就先copy一份 不是因為進去
10/22 21:14, 1F

10/22 21:16, , 2F
foo(Bar bar<=這邊assign嘛?);
10/22 21:16, 2F

10/22 21:16, , 3F
應該說initial@@
10/22 21:16, 3F

10/22 21:34, , 4F
另外是VC compile就會報錯 說不能寫成傳copy~ 這是VC獨有嘛?
10/22 21:34, 4F

10/22 22:12, , 5F
推解釋:)
10/22 22:12, 5F

10/22 22:29, , 6F
受教了 之前以為copy ctor 的 pass by value 是直接assign給
10/22 22:29, 6F

10/22 22:30, , 7F
parameter
10/22 22:30, 7F

10/22 22:32, , 8F
那請問pass by reference為什麼就不會有這個問題了呢?
10/22 22:32, 8F

10/22 22:35, , 9F
pass by ref就不會造成copy的行為
10/22 22:35, 9F

10/22 22:35, , 10F
assign是不會call copy c'tor 的, 是initialize
10/22 22:35, 10F

10/22 22:36, , 11F
因此不會再次呼叫copy constructor 自然不會無窮呼叫
10/22 22:36, 11F

10/22 22:38, , 12F
所以pass by ref為什麼不會再一次call copy c'tor呢?
10/22 22:38, 12F

10/22 22:39, , 13F
這是compiler本身自己的行為嗎? 謝謝
10/22 22:39, 13F

10/22 22:45, , 14F
call by ref 不需要產生暫時的物件阿
10/22 22:45, 14F
文章代碼(AID): #1Au5eBSZ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Au5eBSZ (C_and_CPP)