強制類型轉換意味着關閉或挂起了編譯器正常的類型檢查功能,即編譯器在強制類型轉換發生處并不會發出警告,但是最好别用強制類型轉換,不用強制類型轉換也可以也出很好的C++程式。
不論是使用新型的強制類型轉換reinterpret_cast、const_cast、static_cast、dynamic_cast還是舊式強制類型轉換,都有可能給整個程式埋下難以預料的問題,每次使用強制類型轉換之前,最好想一想能不能采用其它的方法達到同樣的目的,如果非使用不可,則應限制強制類型轉換值的作用域,并且記錄所有強制轉換的位置,這樣可以減少錯誤發生的機會也便于調試。
例如:
int *ip;
char *cp = reinterpret_cast<char*>(ip);
程式員必須永遠記得 cp 所指向的真實對象其實是 int 型,而并非字元數組。任何假設cp是普通字元指針的應用,都有可能帶來有趣的運作時錯誤。例如,下面語句用 cp 來初始化一個 string 對象:
string str(pc);
它可能會引起運作時的怪異行為。用 cp 初始化 str 這個例子很好地說明了顯式強制轉換是多麼的危險。問題源于類型已經改變 時編譯器沒有提供任何警告或錯誤提示。當我們用 int 型位址初始化cp時,由于顯式地聲明了這樣的轉換是正确的,是以編譯器不提供任何錯誤或警告資訊。後面對cp的使用都假設它存放的是 char* 型對象的位址,編譯器确實無法知道 cp 實際上是指向 int 型對象的指針。是以用cp初始化 str 是完全正确的——雖然實際上是無意義的或是錯誤的。查找這類問題的原因相當困難,特别是如果 ip 到cp 的強制轉換和使用cp 初始化 string對象這兩個應用發生在不同檔案中的時候。