C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)
生活随笔
收集整理的這篇文章主要介紹了
C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Q:什么是C風格轉換?什么是static_cast, dynamic_cast 以及 reinterpret_cast?區別是什么?為什么要注意?
A:轉換的含義是通過改變一個變量的類型為別的類型從而改變該變量的表示方式。為了類型轉換一個簡單對象為另一個對象你會使用傳統的類型轉換操作符。比如,為了轉換一個類型為doubole的浮點數的指針到整型:
代碼:
int i;
double d;
i = (int) d;或者:i = int (d);
對于具有標準定義轉換的簡單類型而言工作的很好。然而,這樣的轉換符也能不分皂白的應用于類(class)和類的指針。ANSI-C++標準定義了四個新的轉換符:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在于控制類(class)之間的類型轉換。
代碼:static_cast:靜態類型轉換? const_cast:常量類型轉換 dynamic_cast:動態類型轉換 reinterpret_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。
A:轉換的含義是通過改變一個變量的類型為別的類型從而改變該變量的表示方式。為了類型轉換一個簡單對象為另一個對象你會使用傳統的類型轉換操作符。比如,為了轉換一個類型為doubole的浮點數的指針到整型:
代碼:
int i;
double d;
i = (int) d;或者:i = int (d);
對于具有標準定義轉換的簡單類型而言工作的很好。然而,這樣的轉換符也能不分皂白的應用于類(class)和類的指針。ANSI-C++標準定義了四個新的轉換符:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在于控制類(class)之間的類型轉換。
代碼:
- reinterpret_cast<new_type>(expression)
- dynamic_cast<new_type>(expression)
- static_cast<new_type>(expression)
- const_cast<new_type>(expression)
4.reinterpret_cast
interpret是解釋的意思,reinterpret即為重新解釋,此標識符的意思即為數據的二進制形式重新解釋,但是不改變其值。如:int i; char *ptr="hello freind!"; i=reinterpret_cast<int>(ptr);這個轉換方式很少使用。
reinterpret_cast運算符是用來處理無關類型之間的轉換;它會產生一個新的值,這個值會有與原始參數(expressoin)有完全相同的比特位。
- 從指針類型到一個足夠大的整數類型
- 從整數類型或者枚舉類型到指針類型
- 從一個指向函數的指針到另一個不同類型的指向函數的指針
- 從一個指向對象的指針到另一個不同類型的指向對象的指針
- 從一個指向類函數成員的指針到另一個指向不同類型的函數成員的指針
- 從一個指向類數據成員的指針到另一個指向不同類型的數據成員的指針
-
//基本類型指針的類型轉換
double d=9.2;
double* pd = &d;
int *pi = reinterpret_cast<int*>(pd);??//相當于int *pi = (int*)pd;
//不相關的類的指針的類型轉換
class A{};
class B{};
A* pa = new A;
B* pb = reinterpret_cast<B*>(pa);???//相當于B* pb = (B*)pa;
總結
以上是生活随笔為你收集整理的C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql隐式转换造成索引失效的事故总结
- 下一篇: 从C++中的const到MMU(存储器管