C++中有哪些類型轉換方式

C++中四種類型轉換運算符的使用方法 

reinterpret_cast 
該函數將一個類型的指針轉換爲另一個類型的指針
這種轉換不用修改指針變量值存放格式(不改變指針變量值),只需在編譯時重新解釋指針的類型就可做到. 
reinterpret_cast 可以將指針值轉換爲一個整型數,但不能用於非指針類型的轉換
例: 
//基本類型指針的類型轉換 
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; 

//指針轉換爲整數 
long l = reinterpret_cast<long>(pi); //相當於long l = (long)pi; 


const_cast 

該函數用於去除指針變量的常量屬性,將它轉換爲一個對應指針類型的普通變量。反過來,也可以將一個非常量的指針變量轉換爲一個常指針變量。 
這種轉換是在編譯期間做出的類型更改。 
例: 
const int* pci = 0; 
int* pk = const_cast<int*>(pci); //相當於int* pk = (int*)pci; 

const A* pca = new A; 
A* pa = const_cast<A*>(pca); //相當於A* pa = (A*)pca; 

出於安全性考慮,const_cast無法將非指針的常量轉換爲普通變量。 


static_cast 

該函數主要用於基本類型之間具有繼承關係的類型之間的轉換。 
這種轉換一般會更改變量的內部表示方式,因此,static_cast應用於指針類型轉換沒有太大意義。 
例: 
//基本類型轉換 
int i=0; 
double d = static_cast<double>(i); //相當於 double d = (double)i; 

//轉換繼承類的對象爲基類對象 
class Base{}; 
class Derived : public Base{}; 
Derived d; 
Base b = static_cast<Base>(d); //相當於 Base b = (Base)d; 


dynamic_cast 

它與static_cast相對,是動態轉換。 
這種轉換是在運行時進行轉換分析的,並非在編譯時進行,明顯區別於上面三個類型轉換操作。 
該函數只能在繼承類對象的指針之間或引用之間進行類型轉換。進行轉換時,會根據當前運行時類型信息,判斷類型對象之間的轉換是否合法。dynamic_cast的指針轉換失敗,可通過是否爲null檢測,引用轉換失敗則拋出一個bad_cast異常。 
例: 
class Base{}; 
class Derived : public Base{}; 

//派生類指針轉換爲基類指針 
Derived *pd = new Derived; 
Base *pb = dynamic_cast<Base*>(pd); 

if (!pb) 
cout << "類型轉換失敗" << endl; 

//沒有繼承關係,但被轉換類有虛函數 
class A(virtual ~A();) //有虛函數 
class B{}: 
A* pa = new A; 
B* pb = dynamic_cast<B*>(pa); 

如果對無繼承關係或者沒有虛函數的對象指針進行轉換、基本類型指針轉換以及基類指針轉換爲派生類指針,都不能通過編譯。 

參考文獻:http://bbs.bccn.net/thread-235527-1-1.html
發佈了41 篇原創文章 · 獲贊 50 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章