static_cast 和 reinterpret_cast區別

C++中類型之間的轉換,可以分爲隱式類型轉換和顯式類型轉換

隱式類型轉換是自動執行的,無需顯式的進行操作。 隱式類型轉換髮生在很多地方,比如函數實參到形參的類型轉換、函數返回值類型的自動轉換,在此不進行進一步的介紹。

C++ 提供四種轉換操作符來實現顯式類型轉換(強類型轉換),static_cast, reinterpret_cast, const_cast 和 dynamic_cast

const_cast 和 dynamic_cast

後面的兩種中,const_cast用於去除除對象的const或者volatile屬性;dynamic_cast 需要 RTTI 支持, 主要用於把基類指針轉換爲派生類指針

static_cast 和 reinterpret_cast

關於static_cast和reinterpret_cast,需要記住static_cast 運算符完成相關類型之間的轉換. 而 reinterpret_cast 處理互不相關的類型之間的轉換.

所謂"相關類型"指的是從邏輯上來說,多多少少還有那麼一點聯繫的類型,比如從 double 到 int,我們知道它們之間還是有聯繫的,只是精度差異而已,使用 static_cast 就是告訴編譯器:我知道會引起精度損失,但是我不在乎. 又如從 void* 到 具體類型指針像 char*,從語義上我們知道 void* 可以是任意類型的指針,當然也有可能是 char* 型的指針,這就是所謂的"多多少少還有那麼一點聯繫"的意思. 又如從派生類層次中的上行轉換(即從派生類指針到基類指針,因爲是安全的,所以可以用隱式類型轉換)或者下行轉換(不安全,應該用 dynamic_cast 代替).
對於static_cast操作符,如果需要截斷,補齊或者指針偏移編譯器都會自動完成.注意這一點,是和 reinterpret_cast 的一個根本區別.

"互不相關的類型"指的是兩種完全不同的類型,如從整型到指針類型,或者從一個指針到另一個毫不相干的指針.

reinterpret_cast 常用的一個用途是轉換函數指針類型,即可以將一種類型的函數指針轉換爲另一種類型的函數指針,也可以將整數和指針之間進行轉換,但這種轉換可能會導致不正確的結果,需謹慎使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章