看板 C_and_CPP 關於我們 聯絡資訊
分享一下我之前聽過的概念 C++設計這四種轉型,是為了防止PG做了不是自己想做的動作 例如通常會設成const,就是希望不要去動到他的值 但是這時候PG有這個必要性的時候,他就必須要用const_cast 這意義代表著PG必須自己清楚的了解,自己正在做"把const剝掉"這種危險事 static_cast是最普通的情況,基本上就是值互轉都是用這個 例如int轉char,int轉double等等 dynamic_cast是用於多型的時候,在run-time時決定是否可以真的這樣轉 例如將Based*轉成Derived* const_cast是用於剝掉const屬性 例如const char*轉成char* 至於reinterpret_cast這東西很危險,通常也不太會用到 像是int*轉成char*,意義是"重新解析這個東西" 通常是在寫很底層,硬要用自己想要的觀點去存取資料結構,才會用到 至於void*是萬用型態,是個特例,所以可以用static_cast轉 至於C-style轉型,就是這四種的混合體,也就是暴力轉 C++故意將轉型分成四種,就是希望PG自己負起轉型的責任 PG使用不同的_cast的當下,必須清楚的知道自己在做什麼 也因此,通常C++的PG不應該去用C-style的轉型 ※ 引述《james732 (好人超)》之銘言: : 我想要請問一下,C++有四種新式的cast operator: : static_cast, dynamic_cast, const_cast, reinterpret_cast : 但我卻不知道這幾種 cast 的正確使用時機 : 目前對它們的認識僅有: : static_cast<T>(exp) 與傳統的 (T)exp 是相同的意思 : 其他三種則負責傳統轉型無法做到的東西 : dynamic_cast<T>(exp) 與多型類別的轉換有關 : const_cast<T>(exp) 可以去除"const"這個特性,讓函式傳遞時能過關 : 我想它們被設計出來,應該會有些場合是「非用不可」的 : 但是卻試不出適合的例子 : 特別是 reinterpret_cast, 很多書都只說一句「與平台相依」 : 但是卻不懂它具體該怎麼使用... : 因此想要請教一下,可否對於這幾種 cast 舉些「非用不可」的範例呢? : 譬如說,在哪一種狀況裡,如果不使用 dynamic_cast 就一定會錯誤之類的 : 這幾個東西困擾了我好久,雖然沒學會好像也沒什麼關係 XD : 但就覺得不太對勁... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.235.154 ※ 編輯: nowar100 來自: 140.113.235.154 (12/28 23:30)
VictorTom:推....:) 12/29 10:51
tyc5116:記得上次討論時有說到,除了static_cast以外,其餘的轉型 12/29 13:17
tyc5116:在使用時都要慎重考慮是否有其必要性 12/29 13:17