看板 EE_DSnP 關於我們 聯絡資訊
※ 引述《scuendless (scu)》之銘言: : 想請問一下大家 : 在看講義的時候不是很了解 : 為什麼const_cast<T>()在設計的時候 : 為什麼只能對pointer做轉換呢? : 如果說C++可以透過對object取址再取ref的方式來繞過去 : 那那時候設計只能對pointer轉換的用意是甚麼呢? : (就有甚麼情況我們是希望可以動const pointer但盡量不要動const object嗎) : 想不太到甚麼合理的原因耶 : 謝謝!! "const is used for a reason"! 所以就語意上來說,其實不應該讓你可以將 const cast 掉。 也就是說,如果那個 const 是你自己寫 code 時加上去的, 你就不應該在其他地方想要把這個 const 去掉。 那我們什麼時候會需要用到 const_cast 呢? 應該是你拿到一些 legacy code 的 function,它的 prototype 沒有宣告 const, 而你 (caller) 要傳入的的 parameter 本來是 const, 如果要改的話就茲事體大 (或是根本不能改,比方說只給 lib + header files), 所以不得已,只好將 const cast 掉。 也就是說,const_cast 是用在 parameter passing 的時候, 像是: void iAmLegacyCode(TypeName *p) { ... } .... void myFunction() { const TypeName *pp; ... iAmLegacyCode(const_cast<TypeName *>(pp)); ... } 相反的,如果 parameter 是 object type, 那在傳的時候本來就會做一份 copy,所以有沒有 const 就沒差了! void iAmLegacyCode2(TypeName p) { ... } .... void myFunction() { const TypeName pp; ... iAmLegacyCode(pp); // will do "TypeName p = pp" ... } 另外還有一個很重要的觀念是: const_cast 不會把原來變數本身 "const" 的屬性改成 non-const 也就是說, const_cast<TypeName *>(pp) 其實是產生 pp 的一份 "TypeName *" 的 copy, 意即一個暫時(無名)的 pointer,指到與 pp 指到的相同的位置, 而這個指到的位址裡的內容與屬性是不會改變的。 總之 const_cast 對於 pp 指到的內容本身來說是沒有影響的, pp 在其他地方還是 const TypeName *。 但是如果我們允許 const_cast<TypeName>(pp), 那麼我們將會改變到 pp 本身的內容與屬性, 執行完後 pp 本身的 const 就不見了! 大致是這樣吧,我想,歡迎補充。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.193.11.13 ※ 編輯: ric2k1 來自: 123.193.11.13 (10/14 21:07)