C++的顯式轉換

     在C++中顯式轉換類型的操作函數有static_cast,reinterpret_cast,const_cast和dynamic_cast,前面三個是在編譯時實現,後面一個dynamic_cast是在執行時實現,這些操作函數都是模板函數,
    static_cast<new_type>(expression)
  reinterpret_cast<new_type>(expression)
  const_cast<new_type>(expression)
  dynamic_cast<new_type>(expression)
  new_type是要轉變成的類型,expression是變量,轉變後返回新類型的數據。


1.reinterpret_cast<new_type>(expression)
  該函數是將一個類型的指針轉換成另一種類型指針或者是一個整形數,注意expression是指針類型,不能轉變非指針變量,這種轉換不改變指針變量數據存放的格式。


double *a = 10;
int *b = reinterpret_cast<int*>(a); //相當於隱式轉換int *b = (int*)a;
long c  = reinterpret_cast<long>(a); //轉變爲非指針變量
  
class A{};
class B{};
A *pA = new A;
B *pB = reinterpret_cast<B*>(pA); //轉換類指針


double a = 10;
int b = reinterpret_cast<int>(a); //錯誤的,不能用於非指針類型轉變
const int * pa = new int;
void * pv = reinterpret_cast<void*>(pa); //錯誤,不能將const指針轉換爲void*指針


2.const_cast<new_type>(expression)
  用於去除指針的常量屬性,轉換爲同類型的非常量類型,也可以反過來,將非常量的指針轉換爲同類型的常量指針,只能對於指針類型!


const int *a = new int;
int *b = const_cast<int *>(a);
const int * c = const_cast<const int*>(b);
//對於非指針變量都無法通過編譯
const int a = 10;
int b  = const_cast<int>(a);//錯誤
int *c = const_cast<int*>(a); //錯誤


3.static_cast<new_type>(expression)
  用於基本類型之間和具有繼承關係的類之間的轉換,這種轉換會改變變量的內部表示方式,也可以用於指針類型,但不必reinterpret_cast<>()效率高。


int a = 10;
double b = static_cast<double>(a);
class A{};
class B:public A{};
B b;
A a = static_cast<A>(b); //繼承的轉換

在轉換具有繼承關係的類對象是指針類型時,存在一定的危險!!



4.dynamic_cast<new_type>(expression)
  這個是在執行的時候才進行類型轉換,與其他3個不同之一,只能用於繼承類對象指針或引用之間進行類型轉換,以及沒有繼承關係的繼承類但被轉換類具有虛函數的對象進行轉換。
  可以判斷轉換是否成功,對於指針,轉換失敗,則會返回NULL指針,對於引用,轉換失敗,則會拋出bad_cast異常。


//對於具有繼承關係的
class A{};
class B:public A{};
A *a = new A;
B *b = dynamic_cast<B*>(a);
if(!b)
  { cout<< "dynamic_cast轉換失敗" << endl;} 
else 
    { cout << "dynamic_cast轉換成功" << endl;}
A a;
B &b = dyamic_cast<B &>(a); //引用轉換
class A {virtual void fun(){}};
class B{};
A *a = new A;
B *b = dynamic_cast<B*>(a);//接着可以使用if語句判斷是否轉換成功



原文來源 http://c.chinaitlab.com/example/867930.html

發佈了12 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章