亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++標準轉換運算符reinterpret_cast

2019-11-06 06:43:09
字體:
來源:轉載
供稿:網友

reinterPRet_cast <new_type> (expression)

reinterpret_cast運算符是用來處理無關類型之間的轉換;它會產生一個新的值,這個值會有與原始參數(expressoin)有完全相同的比特位。

什么是無關類型?我沒有弄清楚,沒有找到好的文檔來說明類型之間到底都有些什么關系(除了類的繼承以外)。后半句倒是看出了reinterpret_cast的字面意思:重新解釋(類型的比特位)。我們真的可以隨意將一個類型值的比特位交給另一個類型作為它的值嗎?其實不然。

IBM的C++指南里倒是明確告訴了我們reinterpret_cast可以,或者說應該在什么地方用來作為轉換運算符:

從指針類型到一個足夠大的整數類型從整數類型或者枚舉類型到指針類型從一個指向函數的指針到另一個不同類型的指向函數的指針從一個指向對象的指針到另一個不同類型的指向對象的指針從一個指向類函數成員的指針到另一個指向不同類型的函數成員的指針從一個指向類數據成員的指針到另一個指向不同類型的數據成員的指針

不過我在Xcode中測試了一下,事實上reinterpret_cast的使用并不局限在上邊所說的幾項的,任何類型的指針之間都可以互相轉換,都不會得到編譯錯誤。上述列出的幾項,可能 是linux下reinterpret_cast使用的限制,也可能是IBM推薦我們使用reinterpret_cast的方式

所以總結來說:reinterpret_cast用在任意指針(或引用)類型之間的轉換;以及指針與足夠大的整數類型之間的轉換;從整數類型(包括枚舉類型)到指針類型,無視大小。

(所謂"足夠大的整數類型",取決于操作系統的參數,如果是32位的操作系統,就需要整形(int)以上的;如果是64位的操作系統,則至少需要長整形(long)。具體大小可以通過sizeof運算符來查看)。

reinterpret_cast有何作用

從上邊對reinterpret_cast介紹,可以感覺出reinterpret_cast是個很強大的運算符,因為它可以無視種族隔離,隨便搞。但就像生物的準則,不符合自然規律的隨意雜交只會得到不能長久生存的物種。隨意在不同類型之間使用reinterpret_cast,也之后造成程序的破壞和不能使用。

比如下邊的代碼typedef int (*FunctionPointer)(int); int value = 21; FunctionPointer funcP; funcP = reinterpret_cast<FunctionPointer> (&value); funcP(value);

我先用typedef定義了一個指向函數的指針類型,所指向的函數接受一個int類型作為參數。然后我用reinterpret_cast將一個整型的地址轉換成該函數類型并賦值給了相應的變量。最后,我還用該整形變量作為參數交給了指向函數的指針變量。

這個過程編譯器都成功的編譯通過,不過一旦運行我們就會得到"EXC_BAD_access"的運行錯誤,因為我們通過funcP所指的地址找到的并不是函數入口。

由此可知,reinterpret_cast雖然看似強大,作用卻沒有那么廣。IBM的C++指南、C++之父Bjarne Stroustrup的FAQ網頁和MSDN的Visual C++也都指出:錯誤的使用reinterpret_cast很容易導致程序的不安全,只有將轉換后的類型值轉換回到其原始類型,這樣才是正確使用reinterpret_cast方式。

這樣說起來,reinterpret_cast轉換成其它類型的目的只是臨時的隱藏自己的什么(做個臥底?),要真想使用那個值,還是需要讓其露出真面目才行。那到底它在C++中有其何存在的價值呢?

MSDN的Visual C++ Developer Center 給出了它的使用價值:用來輔助哈希函數。下邊是MSNDN上的例子:

                // expre_reinterpret_cast_Operator.cpp// compile with: /EHsc#include <iostream>// Returns a hash code based on an addressunsigned short Hash( void *p ) {	unsigned int val = reinterpret_cast<unsigned int>( p );	return ( unsigned short )( val ^ (val >> 16));}using namespace std;int main() {	int a[20];	for ( int i = 0; i < 20; i++ )		cout << Hash( a + i ) << endl;}//如果跟我一樣是64位的系統,可能需要將unsigned int改成 unsigned long才能運行。            

這段代碼適合體現哈希的思想,暫時不做深究,但至少看Hash函數里面的操作,也能體會到,對整數的操作顯然要對地址操作更方便。在集合中存放整形數值,也要比存放地址更具有擴展性(當然如果存void *擴展性也是一樣很高的),唯一損失的可能就是存取的時候整形和地址的轉換(這完全可以忽略不計)。

不過可讀性可能就不高,所以在這種情況下使用的時候,就可以用typedef來定義個指針類型:typedef unsigned int PointerType;

這樣不是更棒,當我們在64位機器上運行的時候,只要改成:typedef unsigned long PointerType;

當reinterpret_cast面對const

IBM的C++指南指出:reinterpret_cast不能像const_cast那樣去除const修飾符。 這是什么意思呢?代碼還是最直觀的表述:

int main() {	typedef void (*FunctionPointer)(int);	int value = 21;	const int* pointer = &value;		//int * pointer_r = reinterpret_cast<int*> (pointer); 	// Error: reinterpret_cast from type 'const int*' to type 'int*' casts away constness		FunctionPointer funcP = reinterpret_cast<FunctionPointer> (pointer);}

例子里,我們像前面const_cast一篇舉到的例子那樣,希望將指向const的指針用運算符轉換成非指向const的指針。但是當實用reinterpret_cast的時候,編譯器直接報錯組織了該過程。這就體現出了const_cast的獨特之處。

但是,例子中還有一個轉換是將指向const int的指針付給指向函數的指針,編譯順利通過編譯,當然結果也會跟前面的例子一樣是無意義的。

如果我們換一種角度來看,這似乎也是合理的。因為const int* p = &value;int * const q = &value;

這兩個語句的含義是不同的,前者是"所指內容不可變",后者則是"指向的地址不可變"(具體參考此處)。因此指向函數的指針默認應該就帶有"所指內容不可變"的特性。

畢竟函數在編譯之后,其操作過程就固定在那里了,我們唯一能做的就是傳遞一些參數給指針,而無法改變已編譯函數的過程。所以從這個角度來想,上邊例子使用reinterpret_cast從const int * 到FunctionPointer轉換就變得合理了,因為它并沒有去除const限定

Director: Jim FawcettC++ Language Tutorial - Type CastingObject Oriented DesignIBM Complilers - XL C/C++ V9.0 for Linux - The reinterpret_cast operator (C++ only)Bjarne Stroustrup's C++ Style and Technique FAQMSDN Visual C++ Developer Center - reinterpret_cast Operator
上一篇:c++實驗2

下一篇:C++之string類型詳解

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性xxxx极品hd满灌| 中文字幕精品影院| 国产精品电影观看| 日韩a**站在线观看| 国产在线拍偷自揄拍精品| 清纯唯美亚洲综合| 欧美在线国产精品| 久久影院资源网| 狠狠综合久久av一区二区小说| 亚洲另类xxxx| 国产精品人人做人人爽| 国产精品自产拍在线观| 日韩国产精品亚洲а∨天堂免| 亚洲国产日韩欧美在线动漫| 精品久久久国产精品999| 亚洲欧美国产一区二区三区| 自拍亚洲一区欧美另类| 亚洲一区二区免费在线| 亚洲一品av免费观看| 欧美性一区二区三区| 成人黄色av播放免费| 国产精品啪视频| 久久久久久久久久久国产| 国产精品网址在线| www.久久草.com| 成人h片在线播放免费网站| 欧美日韩亚洲一区二区三区| 欧美日韩亚洲视频| 最近日韩中文字幕中文| 亚洲激情在线观看视频免费| 久久精品国产欧美激情| 久久精品中文字幕电影| 国产69精品久久久久久| 久久久久久久久久亚洲| 国产精品日韩av| 深夜福利亚洲导航| 高清欧美性猛交xxxx| 国产精品久久久久99| 久久视频国产精品免费视频在线| 国产丝袜视频一区| 久久影院资源网| 亚洲va电影大全| 久久久噜噜噜久久中文字免| 亚洲成人av中文字幕| 国产偷亚洲偷欧美偷精品| 欧美一级片免费在线| 亚洲电影免费观看高清| 国产精品免费网站| 欧美在线视频观看免费网站| 日韩中文有码在线视频| 日韩激情av在线播放| 日韩美女免费视频| 日韩av在线天堂网| 国产精品中文字幕在线| 亚洲精品天天看| 97视频免费观看| 欧美乱大交xxxxx另类电影| 亚洲激情视频在线| 亚洲网站视频福利| 中文字幕亚洲欧美| 日韩精品福利网站| 欧美黑人xxx| 亚洲精品久久久久国产| 国产精品伦子伦免费视频| 日韩精品视频在线免费观看| 日本高清+成人网在线观看| 欧美老女人性生活| 亚洲国产精品成人av| 一本色道久久88亚洲综合88| 日韩免费在线观看视频| 欧美日韩亚洲系列| 日韩高清中文字幕| 欧美中文字幕精品| 色中色综合影院手机版在线观看| 欧美风情在线观看| 亚洲欧美国产另类| 欧美自拍视频在线| 国产精品久久久久久久久影视| 伊人伊成久久人综合网小说| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩在线观看免费全| 亚洲免费一在线| 欧美性生交大片免网| 久久精品国产欧美激情| 欧美日韩视频免费播放| 黄色一区二区三区| 国产精品久久久久久久美男| 成人网在线观看| 欧美国产在线视频| 91亚洲国产成人精品性色| 国产成人高清激情视频在线观看| 亚洲va欧美va在线观看| 亚洲欧美日韩一区二区在线| 国产免费一区二区三区在线能观看| 岛国av一区二区三区| 国内精品久久久久伊人av| 久久久久女教师免费一区| 成人国产精品色哟哟| www国产精品视频| 久久久久久久影视| 日韩在线观看免费全集电视剧网站| 国产精品午夜一区二区欲梦| 国产91色在线免费| 热久久免费国产视频| 亚洲最新在线视频| 国产精品一久久香蕉国产线看观看| 精品国产一区二区三区久久狼5月| 国产精品自拍视频| 成人在线中文字幕| 欧美性xxxx在线播放| 黄色91在线观看| 久久影视三级福利片| 91久久国产精品91久久性色| 国产精品av免费在线观看| 亚洲国产日韩精品在线| 亚洲最大福利网| 日韩精品中文在线观看| 亚洲 日韩 国产第一| 国产精品美女视频网站| 91国内揄拍国内精品对白| 久久久久久国产免费| 成人有码在线视频| 久久久久亚洲精品国产| 日韩欧美中文字幕在线播放| 欧美亚洲免费电影| 国产精品久久久久久久久免费| 免费99精品国产自在在线| 97视频在线观看网址| 欧美激情精品久久久久久大尺度| 亚洲日韩中文字幕| 欧美日韩中文字幕综合视频| 日韩电影中文 亚洲精品乱码| 91精品国产高清久久久久久| 国产精品久久久久9999| 国产精品美女久久久久久免费| 欧美国产精品日韩| 国产午夜一区二区| 精品亚洲一区二区| 不卡在线观看电视剧完整版| 精品欧美aⅴ在线网站| 日韩av免费在线观看| 亚洲国产精品一区二区久| 岛国精品视频在线播放| 成人亲热视频网站| 91精品久久久久久久久久久久久| 97成人在线视频| 午夜精品久久久久久久99热浪潮| 欧美做爰性生交视频| 欧美专区第一页| 亚洲精品福利免费在线观看| 久久免费高清视频| 国产精品羞羞答答| 欧美激情视频在线观看| 亚洲第一色在线| 亚洲激情久久久| 538国产精品一区二区免费视频| 欧美中文字幕在线| 91国产精品电影| 午夜精品福利在线观看| 国产一区视频在线播放| 欧美精品在线看| 亚洲视频视频在线| 成人久久久久久久| 成人免费观看网址|