CompBook 板


C++ Object Model 答客問 (1) 侯捷 [email protected] 2000.03.25 第一次發表於 清大.楓橋驛站(140.114.87.5).電腦書訊版(Computer/CompBook) 本文將於日後整理於 侯捷網站 侯捷網站:www.jjhou.com ---------------------------------------------------------------- FeiYu wrote (1999/12/29) : > Dear Sir: > 看了Inside C++ Object Model後,有幾點想和你討論: > > 1. 文中多次出現「內化」、「擴張」等詞(尤其在constrctor) > 中譯本內中英對照表並未加以標註,建議你把他加進去, > 因為這些字眼實在很少在其他書中看到。 > > 2. p.26中的程式: > void rotate (X datum,const X* pointer,const X& reference) > { > (*pointer).rotate (); > reference.rotate (); > datum.rotate (); > } // end function > 在VC中編譯會出現轉型上的錯誤,必須拿掉參數列const才可以執行。 > > 3. p52.中間: > ".....這情況下並不需要合成出一個default copy constructor, > 因為上述宣告展現了"default copy semantics"........." > 這段話應如何解釋呢?怎樣才算是default copy semantics? > "bitwise copy semantics"? > > 4. p.74 > 裡面提到 member initialization list 在四種情形下可以 > 被使用(即使沒有用,也可以正確編譯,只是會造成效率不彰), > 但LIPPMAN沒有說明為何會造成編譯器對以兩種不同方式設定初值, > 會擴展成為不同的碼,是因為編譯器設計上某種無法避免的需要? > 還是有其他的原因 > > 5. LIPPMAN書中常常會列出「經過擴展、內化」或是「轉換」 > 過的原始碼,藉由觀察這些碼,可以明顯發現編譯器暗中動了 > 哪些手腳,但這似乎是本書獨有的特色,一般編譯器多提供 > 機器碼的對應,而不會列出pusedo code。不曉得這個說法 > 對不對(我現在用的是VC6) > > 謝謝 侯捷回覆: > 1. 文中多次出現「內化」、「擴張」等詞(尤其在constrctor) > 中譯本內中英對照表並未加以標註,建議你把他加進去, > 因為這些字眼實在很少在其他書中看到。 謝謝你的建議。以下舉兩個例子。 原書 p11: .. the likely internal transformation of the function looks as follows : 中譯本 p13: .. 這個函式有可能被內化為: 換言之我在這裡所使用的「內化」一詞,並無直接對應的英文, 而是依上下文翻譯。 原書 p38: .. the following two augmentations occur during compilation 中譯本 p45: .. 下面兩個擴張行動會在編譯期間發生: 換言之這裡我所使用的「擴張」一詞,就是 augmentations。是的, C++ 編譯器為我們加了許多碼,是一種「擴張」行為。 > 2. p.26中的程式: > ... > 在VC中編譯會出現轉型上的錯誤,必須拿掉參數列const才可以執行。 好的,謝謝。各家編譯器對 const 的鬆緊程度不一, BCB4 和 G++ 對於 p.26 的程式都只給予 warning。 > 3. p52.中間: > ".....這情況下並不需要合成出一個default copy constructor, > 因為上述宣告展現了"default copy semantics"........." > 這段話應如何解釋呢?怎樣才算是default copy semantics? > "bitwise copy semantics"? p53 中間偏下說得很清楚: .. 什麼時候一個 class 不展現出 "bitwise copy semantics" 呢? .. 有四種情況: .. 1. ... .. 2. ... .. 3. ... .. 4. ... 這四點以外的任何情況,便是擁有 "bitwise copy semantics" (亦即 "default copy semantics")。 > 4. p.74 > 裡面提到 member initialization list 在四種情形下可以 > 被使用(即使沒有用,也可以正確編譯,只是會造成效率不彰), > 但LIPPMAN沒有說明為何會造成編譯器對以兩種不同方式設定初值, > 會擴展成為不同的碼,是因為編譯器設計上某種無法避免的需要? > 還是有其他的原因 是因為 C++ 語言在設計上明白區分了 initialization 和 assignment 的不同。 你所謂「以兩種不同方式設定初值」,意思是: (1) 使用 member initialization list (2) 不使用 member initialization list,而在 ctor 中使用 assignments. 為什麼編譯器對於以兩種不同方式設定初值,會擴展成為不同的碼呢? 因為(以下節錄自《C++ Primer 中文版》p719): --- quote --- 兩種作法...差別在於唯有 member initialization list 才 提供 class data members 的初始化行為。 而在 constructor 函式內將數值設定給 data member,其行為是一種 指派(assignment)動作。兩者差異視 data member 的型別而定。 有一個觀念很重要,那就是把 constructor 的執行想像為兩階段: (1) 或隱喻(implicit)或明顯(explicit)的初始化階段 (initialization phase),(2) 一般化的運算階段(computation phase)。 運算階段由 constructor 函式內的所有述句組成,此階段中對任何 data members 的設定動作都被視為一個指派動作(assignment), 而不是一個初始化動作(initialization)。如果不能夠清楚區分出 其間的差異,便往往成為程式錯誤或效率不彰的來源。 初始化階段可以是隱喻的(implicit),也可以是明顯的(explicit), 視 member initialization list 是否存在而定。一個隱喻的初始化階段 會喚起所有 base class 的 default constructors(根據 base class 的宣告 次序),然後再喚起所有 member class object 的 default constructors。 --- unquote --- > 5. LIPPMAN書中常常會列出「經過擴展、內化」或是「轉換」 > 過的原始碼,藉由觀察這些碼,可以明顯發現編譯器暗中動了 > 哪些手腳,但這似乎是本書獨有的特色,一般編譯器多提供 > 機器碼的對應,而不會列出pusedo code。不曉得這個說法 > 對不對(我現在用的是VC6) 對。 你恐怕誤會了 pusedo code 的意思。pusedo code 是意思是 以某種型式的語言表現出某些實際動作。Lippman 在本書中以 大家熟悉的 C++ 語言(是的,本書讀者應該都已熟悉了 C++ 語言) 來表現 pusedo code。事實上 C++ 編譯器當然不會為我們的碼 「擴展、內化、或轉換」出那樣的高層語言。 -- the end  -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ Mail: [email protected]







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燈, 水草
伺服器連線錯誤,造成您的不便還請多多包涵!
「贊助商連結」






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燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP