關於強制轉換操作符reinterpret_cast的實驗和總結

強制轉換操作符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操作符的強大了。

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