作者nowar100 (拋磚引玉)
看板C_and_CPP
標題Re: [問題] C++幾種新式cast的用法
時間Mon Dec 28 23:23:55 2009
分享一下我之前聽過的概念
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