即使類型轉換本身是危險的,在有些時候類型轉換也是不可或缺的。程式員不使用顯式轉換,編譯器也可能會使用隱式轉換,那還不如把代碼控制在程式員自己手中。
C++有4種顯式類型轉換操作符,最好不要使用C語言編程方式遺留的隱式類型轉換。第一,顯式類型轉換在代碼中更明顯,可以提醒程式員你的代碼設計可能存在一些醜陋的地方;第二,顯式類型轉換可以檢測轉換中的錯誤,比如當cast失敗時,你會得到null 指標,但隱式轉換就不會;第三,有些情況,隱式類型轉換無法做到,比如const_cast的功能。
static_cast
編譯器隱式執行的任何類型轉換,都可以使用static_cast顯式完成。一般用於不同大小的類型之間互相轉換。
doubled = 97.0;charch = static_cast<char>(d);
const_cast
顧名思義,用於轉換掉運算式的const性質。
比如我們從外部接受了一個const類型的參數,再傳遞給下層函數時,又需要修改它const_cast就派上用場了。
constchar* pc_str;char*pc = string_copy(const_cast<char*>(pc_str));
dynamic_cast
將基類類型的指標或引用安全地轉換為衍生類別型的指標或引用。如果轉換到指標類型的dynamic_cast失敗,則其結果為0值;如果轉換到參考型別的dynamic_cast失敗,則拋出一個bad_cast類型的異常。這也是為什麼不使用C方式類型轉換的原因,C方式的轉換失敗後,我們不知道如何檢測錯誤。
Derived*derivedPtr = dynamic_cast<Derived*>(basePtr);
reinterpret_cast
為運算元的位元模式提供較低層次的重新解釋。啥意思呢。假設有一堆資料,儲存的是一個int類型的序列,本來應該使用int*對其進行遍曆,但有時候我們可能需要逐個位元組的進行訪問,以進行一些特殊操作。那麼就可以使用此轉換操作符。但我們應當有清醒的意識,其實指標指向的類型一直都是int。
int*ip;char*pc = reinterpret_cast<char*>(ip);
上述內容大部分摘自《C++Primer》一書。