前言 :
關於強制類型轉換的問題,很多書都討論過,寫的最詳細的是C++之父的《C++的設計和演化》. 最好的解決方法就是不要使用C風格的強制類型轉換,而是使用標準C++的類型轉換符:static_cast, dynamic_cast. 標準C++中有四個類型轉換符 : static_cast、dynamic_cast、reinterpret_cast、和const_cast. 下面對它們一一進行介紹.
static_cast :
用法:static_cast < type-id > ( expression )
該運算符把expression轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。 它主要有如下幾種用法 :
注意 : static_cast不能轉換掉expression的const、volitale、或者__unaligned屬性
dynamic_cast :
用法:dynamic_cast < type-id > ( expression )
該運算符把expression轉換成type-id類型的對象。 Type-id必須是類的指針、類的引用或者void *;如果type-id是類指針類型,那麼expression也必須是一個指針,如果type-id是一個引用,那麼expression也必須是一個引用.
dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換. 在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全. 請參考下面範例 :
在上面的代碼段中,如果pb指向一個D類型的對象,pd1和pd2是一樣的,並且對這兩個指針執行D類型的任何操作都是安全的;但是,如果pb指向的是一個B類型的對象,那麼pd1將是一個指向該對象的指針,對它進行D類型的操作將是不安全的(如訪問m_szName),而pd2將是一個空指針。 另外要注意:B要有虛函數,否則會編譯出錯;static_cast則沒有這個限制。 這是由於運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函數表(關於虛函數表的概念,詳細可見
在函數foo中,使用 static_cast 進行轉換是不被允許的,將在編譯時出錯;而使用 dynamic_cast 的轉換則是允許的,結果是空指針.
reinpreter_cast :
用法:reinpreter_cast
type-id必須是一個指針、引用、算術類型、函數指針或者成員指針. 它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還可以得到原先的指針值).
const_cast :
用法:const_cast
該運算符用來修改類型的const或volatile屬性。 除了const 或volatile修飾之外, type_id和expression的類型是一樣的.
常量指針被轉化成非常量指針,並且仍然指向原來的對象;常量引用被轉換成非常量引用,並且仍然指向原來的對象, 參考下面代碼 :
執行結果 :
使用 const_cast 將 const char* 修改後即可對之進行修改.
沒有留言:
張貼留言