強制轉換操作符reinterpret_cast是一個非常有趣的操作符。我們常見的強制轉換操作符static_cast在強制轉換的時候是有一些限制的。例如,我們不能把int這樣的系統內置類型轉換成char*這樣的指針類型,不能進行像int*和char*這樣的指針類型之間的轉換。但是reinterpret_cast卻沒有這方面的限制。它似乎是無所無能的,雖然我沒有把所有的可能性都實驗一遍,但是上述的兩種情況在用reinterpret_cast進行轉換的時候編譯器是可以通過的。當然,編譯通過不代表結果就正確。
下面這段程序作爲一個引子。它說明了char*類型的指針可以直接初始化string對象。
#include <iostream>
#include <string>
using std::string;
int main()
{
char ca[] = "program";
char *cp = ca;
string str = cp;
return 0;
}
可以看見,編譯是正確的。
可以看到,string對象str的值確實就是字符串“program”。
再看下面這段程序
#include <iostream>
#include <string>
using std::string;
int main()
{
int ia = 9;
int *ip = &ia;
char *cp = reinterpret_cast<char*>(ip);//強制把ip付給cp
string str = cp;
return 0;
}
我們看到,編譯是沒有問題的。
cp也確實獲得了ip的地址。
但是,當cp初始化string對象str時出現了問題,如果用輸出流輸出str,那麼結果是什麼都輸出不了。這是因爲雖然我們定義的cp是一個char類型的指針變量,但是cp實際上指向的是一個int類型的變量。在這個程序中我們能夠較爲容易的判斷出cp實際指向的對象,可是如果是在一些比較大的程序中,cp的強制轉換語句與str初始化語句離得非常遠,甚至是在兩個文件中時,這樣的錯誤將是非常隱蔽的,及其難以處理。這個例子很好的說明了強制轉換時多麼的危險。所以程序員應該避免使用強制類型轉換,不用強制類型轉換也能寫出非常好的程序。
另外還有一點想說。如果把上面程序的第九行改爲
char *cp = static_cast<char*>(ip);
程序在編譯的時候就無法通過。
int ia;
char *cp = reinterpret_cast<char*>(ia);
這樣的語句也是可以通過編譯的,而對於static_cast操作符,上面的代碼就不能通過編譯了。這也看出reinterpret_cast操作符的強大了。