国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

C++四種強制類型轉換運算符

2019-11-11 02:53:04
字體:
來源:轉載
供稿:網友
C++有四種強制類型轉換符,分別是dynamic_cast,const_cast,static_cast,reinterPRet_cast。其中dynamic_cast與運行時類型轉換密切相關,在這里我們先介紹dynamic_cast,其他三種在后面介紹。1、dynamic_cast運算符該轉換符用于將一個指向派生類的基類指針或引用轉換為派生類的指針或引用。注意:dynamic_cast轉換符只能用于含有虛函數的類,其表達式為 dynamic_cast<類型>(表達式)其中的類型是指把表達式要轉換成的目標類型,比如含有虛函數的基類B和從基類B派生出的派生類D,則:B *pb; D *pd, md;  pb = &md; pd = dynamic_cast<D *>(pb); 最后一條語句表示把指向派生類D的基類指針pb轉換為派生類D的指針,然后將這個指針賦給派生類D的指針pd,有人可能會覺得這樣做沒有意義,既然指針pd要指向派生類為什么不pd = &md;這樣做更直接呢?有些時候我們需要強制轉換,比如如果指向派生類的基類指針B想訪問派生類D中的除虛函數之外的成員時就需要把該指針轉換為指向派生類D的指針,以達到訪問派生類D中特有的成員的目的,比如派生類D中含有特有的成員函數g(),這時可以這樣來訪問該成員dynamic_cast<D *>(pb)->g();因為dynamic_cast轉換后的結果是一個指向派生類的指針,所以可以這樣訪問派生類中特有的成員。但是該語句不影響原來的指針的類型,即基類指針pb仍然是指向基類B的。如果單獨使用該指針仍然不能訪問派生類中特有的成員。一般情況下不推見這樣使用dynamic_cast轉換符,因為dynamic_cast的轉換并不會總是成功的,具體情況在后面介紹。dynamic_cast的注意事項dynamic_cast轉換符只能用于指針或者引用。dynamic_cast轉換符只能用于含有虛函數的類。dynamic_cast轉換操作符在執行類型轉換時首先將檢查能否成功轉換,如果能成功轉換則轉換之,如果轉換失敗,如果是指針則反回一個0值,如果是轉換的是引用,則拋出一個bad_cast異常,所以在使用dynamic_cast轉換之間應使用if語句對其轉換成功與否進行測試,比如pd = dynamic_cast(pb); if(pd){…}else{…},或者這樣測試if(dynamic_cast(pb)){…}else{…}。因此,dynamic_cast操作符一次執行兩個操作。首先驗證被請求的轉換是否有效,只有轉換有效,操作符才實際進行轉換。基類的指針可以賦值為指向派生類的對象,同樣,基類的引用也可以用派生類對象初始化,因此,dynamic_cast操作符執行的驗證必須在運行時進行。2、const_cast操作符其表達式為 const_cast<類型>(表達式),其中類型指要把表達式轉換為的目標類型。該操作符用于改變const和volatile,const_cast最常用的用途就是刪除const屬性,如果某個變量在大多數時候是常量,而在某個時候又是需要修改的,這時就可以使用const_cast操作符了。const_cast操作符不能改變類型的其他方面,他只能改變const或volatile,即const_cast不能把int改變為double,但可以把const int改變為int。const_cast只能用于指針或引用。const_cast的用法舉例比如:int a=3; const int *b=&a; int* c=const_cast(b); *c=4; cout<<a<<*c;這時輸出兩個4,如果不使用const_cast轉換符則常量指針*c的值是不能改變的,在這里使用const_cast操作符,通過指針b就能改變常量指針和變量a的值。3、static_cast操作符該操作符用于非多態類型的轉換,任何標準轉換都可以使用他,即static_cast可以把int轉換為double,但不能把兩個不相關的類對象進行轉換,比如類A不能轉換為一個不相關的類B類型。static_cast本質上是傳統c語言強制轉換的替代品。static_cast(靜態轉換)執行非多態的轉換,用于代替C中通常的轉換操作。因此,被做為隱式類型轉換使用。顯式告訴編譯器,不關心轉換后精度損失。比如:int i;float f = 166.7f;i = static_cast<int>(f);此時結果,i的值為166。4、reinterpret_cast操作符該操作符用于將一種類型轉換為另一種不同的類型,比如可以把一個整型轉換為一個指針,或把一個指針轉換為一個整型,因此使用該操作符的危險性較高,一般不應使用該操作符。reinterpret_cast(重述轉換)主要是將數據從一種類型的轉換為另一種類型。所謂“通常為操作數的位模式提供較低層的重新解釋”也就是說將數據以二進制存在形式的重新解釋。比如:int i;char *p = "This is a example.";i = reinterpret_cast<int>(p);此時結果,i與p的值是完全相同的。reinterpret_cast的作用是說將指針p的值以二進制(位模式)的方式被解釋為整型,并賦給i,一個明顯的現象是在轉換前后沒有數位損失,即一定不改變元數據。 from http://blog.sina.com.cn/s/blog_8fcf831b0101auaa.html

關于reinterpret_cast,使用這個操作符的類型轉換,其的轉換結果幾乎都是執行期定義(implementation-defined)。因此,使用reinterpret_casts的代碼很難移植。 

reinterpret_casts的最普通的用途就是在函數指針類型之間進行轉換。例如,假設你有一個函數指針數組:

typedef void (*FuncPtr)(); // FuncPtr是一個指向函數的指針,該函數沒有參數返回值類型為void

FuncPtr funcPtrArray[10]; // funcPtrArray是一個能容納10個FuncPtrs指針的數組 

讓我們假設你希望(因為某些莫名其妙的原因)把一個指向下面函數的指針存入funcPtrArray數組:

int doSomething();

你不能不經過類型轉換而直接去做,因為doSomething函數對于funcPtrArray數組來說有一個錯誤的類型。在FuncPtrArray數組里的函數返回值是void類型,而doSomething函數返回值是int類型。

funcPtrArray[0]  =  &doSomething; // 錯誤!類型不匹配reinterpret_cast可以讓你迫使編譯器以你的方法去看待它們

funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); // this compiles 

 

轉換函數指針的代碼是不可移植的(C++不保證所有的函數指針都被用一樣的方法表示),在一些情況下這樣的轉換會產生不正確的結果。

from http://zhidao.baidu.com/question/110604232.html?fr=qrl&index=0&qbl=topic_question_0&Word=staticcast%20dynamiccast


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

圖片精選

主站蜘蛛池模板: 印江| 长宁县| 芜湖市| 巴楚县| 大兴区| 岳池县| 扎赉特旗| 玛沁县| 巴彦县| 牡丹江市| 泌阳县| 常德市| 安溪县| 金堂县| 兴安盟| 达日县| 海伦市| 玛曲县| 湖北省| 通江县| 海原县| 唐河县| 深州市| 丹寨县| 梓潼县| 石楼县| 济源市| 兖州市| 龙里县| 丹江口市| 平武县| 友谊县| 积石山| 白玉县| 乐昌市| 丰都县| 张掖市| 辽宁省| 渑池县| 鄂州市| 台中市|