EE_DSnP 板


LINE

: 推 gamerred:想問A a = A(10);的constructor呼叫是不是建立兩個物件 09/30 18:36 : → gamerred:再用memberwise assignment? 我的理解中implicit建構似乎 09/30 18:37 : → gamerred:與用explicit呼叫效果只有微妙的差異 而不是在上面那種說 09/30 18:38 : → gamerred:法 是這樣嗎? 09/30 18:38 這個有可能會 compiler dependent, 但就我的理解來說, 假設有 A(), A(int), A(const A&) // copy constructor 三種 constructors, 1. A a = A(10); 會直接 explicitly 呼叫 A(int) 來 construct a 其效果跟 "A a(10)" 是一樣的 2. A a = 10; 會直接 implicitly 呼叫 A(int) 來 construct a 其效果跟 "A a(10)" 是一樣的 3. A a = a2; // a2 is a class A object 會呼叫 copy constructor 來 construct a 其效果跟 "A a(a2)" 是一樣的 4. A a; // 先呼叫 A() a = a2; // 再執行 '=' (assignment) operator : 推 djshen:所以constructor會回傳一個object沒錯吧? 以前計程一直強調 09/30 19:05 : → djshen:寫constructor不可以寫回傳型態 所以沒思考到這點 09/30 19:05 嚴格來說,constructor 並不用回傳 (return) 任何東西, 他只是建立一個物件。 (底下 FYI only...) 而且 compiler 會將一些看似會產生 internal objects 的地方合併, 直接作用在同一個記憶體位置。 例如: A operator + (const A& b) const { A sum = *this; ...; return sum; } ^ ^ ^ |---------------------------------| | | | 這兩個 A 物件會 associate 在一起,所以這裡 ------------------| 不會有 copy constructor 被呼叫。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.36.57.234 ※ 編輯: ric2k1 來自: 114.36.57.234 (09/30 23:57)
1F:→ ric2k1:忘記講 implicit constructor,補充一下... 09/30 23:58
2F:推 gamerred:謝謝老師的回答 我還有一個問題 關於最後一點 10/01 00:07
3F:→ gamerred:return by value 的時候,還是會有臨時物件出現吧? 10/01 00:08
4F:→ gamerred:以文中的例子來看 回傳的時候scope的問題還是存在 10/01 00:08
5F:→ gamerred:按照老師所說 compiler是怎麼做到優化的呢? 10/01 00:09
6F:→ ric2k1:這個我剛剛有做實驗確認過,的確沒有臨時的物件被產生出來 10/01 00:17
7F:推 djshen:推 我剛剛用typeid去看 class叫A object傳回1A A()則是 10/01 00:17
8F:→ ric2k1:我想 compiler 可以察覺到 A sum 最後都是會被備份出去, 10/01 00:18
9F:→ djshen:F1Ave 1是class name的長度 不過F ve就不懂了 10/01 00:18
10F:→ ric2k1:所以就共用一份記憶體空間 (物件) 就好了 10/01 00:18
11F:推 djshen:然後我又試了typeid((A())).name() 結果又變成1A了.. 10/01 00:42
12F:→ djshen:typeid(A()).name()是F1Ave 多個括弧有差@@ 10/01 00:43
13F:推 gamerred:我用visual studio測試的結果還是有臨時物件耶 10/01 00:49
14F:→ gamerred:我記得學計程的時候林宗男教授也強調過這一點XD 10/01 00:50
15F:→ gamerred:不過如果說某個optimization mode會幫忙弄掉我也不意外啦 10/01 00:51
16F:推 djshen:我試著cout<<&(A()); g++表示taking address of temporary 10/01 01:05
17F:→ djshen:好像跟你們說的東西不一樣 不要理我XD 10/01 01:06
18F:推 gamerred:喔 對阿 A()回傳的是一個暫時物件阿 10/01 01:11
19F:→ gamerred:阿 應該說產生... 10/01 01:11
20F:→ ric2k1:樓上說的不衝突啊! 你例子中的 A() 由於沒有人 take 就要被 10/01 01:12
21F:→ ric2k1:&() 並且 cout 出去,所以一定會產生暫時的物件,沒有辦法 10/01 01:13
22F:→ ric2k1:被其他的物件河蟹 (誤) 掉... 10/01 01:13
23F:→ ric2k1:我是指 djshen... 10/01 01:14
24F:→ ric2k1:再舉一個會被河蟹掉的例子: 10/01 01:15
25F:→ ric2k1:A a = A(30) + A(40); 10/01 01:15
26F:→ ric2k1:那個 A(30) + A(40) 的結果就不會產生臨時的物件, 10/01 01:16
27F:→ ric2k1:他們加完的結果會被直接 construct 成 a 10/01 01:17
28F:→ ric2k1:比較精確的說法應該是: 因為被河蟹掉了,所以自始至終都是 10/01 01:20
29F:→ ric2k1:在同一個記憶體位置操作 10/01 01:20
30F:→ ric2k1:// 我覺得大家可能會覺得看這個討論串有點不知所云吧 orz 10/01 01:21
31F:→ ric2k1:忍不住再說一個: 10/01 01:21
32F:→ ric2k1:a = A(30) + A(40) 就會有臨時的物件產生了... 10/01 01:22
33F:→ ric2k1:而這個臨時的物件在被 assign 給 a 之後就會被 destruct 掉 10/01 01:23
34F:推 djshen:如果照上面的operator+ 不會回傳sum嗎? 10/01 01:25
35F:推 gamerred:回樓上 如果operator+是return by value他會回傳一個 10/01 01:28
36F:→ gamerred:臨時物件 如果前面是一個新的A 就會綁上去 如果是一個舊 10/01 01:29
37F:→ gamerred:的A 就會assign完之後自我毀滅 大概就是這個意思吧 10/01 01:30
38F:推 djshen:我想也是 10/01 01:33
39F:推 djshen:實驗了一下 A a =A(30)+A(40) 好像沒有呼叫constructor耶 10/01 02:04
40F:→ djshen:operator+完之後 &a就變成&sum了 10/01 02:05
41F:→ ric2k1:overload 一下 copy constructor, 你就會看到了! 10/01 02:06
42F:推 gamerred:恩 綁好了之後其實就是原本那個阿 10/01 02:06
43F:推 djshen:我有寫copy constructor@@ 10/01 02:07
44F:→ djshen:還是說complie的時候就會把a sum變成同一個? 10/01 02:09
45F:推 gamerred:應該是如此 10/01 02:16
46F:→ ric2k1:你的 operator + 是 return A 嗎? 如果是的話,應該是會 10/01 02:17
47F:→ ric2k1:呼叫 copy constructor 來建立 a 啊! 10/01 02:17
48F:→ ric2k1:啊! 我想起來了,的確不會, 10/01 02:18
49F:→ ric2k1:A a 與 sum 綁在一起,所以只看的到 A sum 的 constructor 10/01 02:19
50F:→ ric2k1:不要理會我的自言自語... 10/01 02:19







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP