dynamic_cast,const_cast,static_cast,reinterpret_cast

dynamic_cast:   通常在基類和派生類之間轉換時使用,run-time   cast   
    
  const_cast:   主要針對const和volatile的轉換.   
    
  static_cast:   一般的轉換,no   run-time   check.通常,如果你不知道該用哪個,就用這個。   
    
  reinterpret_cast:   用於進行沒有任何關聯之間的轉換,比如一個字符指針轉換爲一個整形數。


http://blog.csdn.net/goodluckyxl/archive/2005/01/19/259851.aspx

強制轉化四種類型可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不瞭解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。
                                                            2004-11-27 9:00

強制轉化無論從語法還是語意上看,都是c++中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制類型轉化最終還是被c++接受了。
1.static_cast運算符號
static_cast<T>(e),stroustrup讓我們可以把它看成隱含轉換的顯示的逆運算。這個是有一定道理的,基於隱式轉化的對象類型我們可以使用static_cast轉化運算符號。它是靜態的檢測,無法運行時檢測類型,在繼承中尤爲突出。
使用範圍
<1>用於所有系統類型之間轉化,不能用於系統類型指針類型轉化
  double t_d = 0;
int t_i= static_cast<int>(t_d); //是合法的轉化
而企圖將double*->int*是不允許的
<2>用於繼承類之間的轉化(含指針),不能用於其他沒有隱式轉化的對象類型之間的轉化
繼承舉例:
class x
{
};
class y: public x
{
};
使用:x t_o_x;
y t_o_y = static_cast<y>(t_o_x); //x* y*轉化也可以進行因爲x,y繼承關
//系,類型可以自動隱式轉化使用
   隱式轉化舉例:
class x
{
};
class y
{

public:
    y( x i_x ) {}
};
    x t_o_x;
     y t_o_y = static_cast<y>(t_o_x); //大家看到y構造函數可以對於x類型隱式轉化
//所以可以將x->y,如果企圖將y->x會報錯
2.reinterpret_cast 運算
主 要用於對於類型指針類型的強制轉化,some_type* -> special_type*這樣轉化,類型信息可以是不完全的。它允許將任意指針轉化到其他類型指針,也允許任意整數類型到任意指針類型轉化(BT)。這 樣導致的結果是極其不安全的,不能安全的應用於其他目的,除非轉化到原來類型。
<1> 使用所有整形可以轉化爲任意類型的指針(指針是4字節的long的東東,那麼機器就認爲同類型就是可以轉化)
int c;
x* p = reinterpret_cast<x*>(c); //x是自定義的任意類型,當然包括系統類型
<2> 可以對於任意類型指針之間轉化
y* c;
x* p = reinterpret_cast<x*>(c);//x,y代表所有自定義或系統類型
大家可以看到reinterpret_cast的轉化是極度的不負責任的,他只管轉化不檢測是否可以轉化。
<3> const_cast運算符號
這個很簡單從名字大家可以看出來,僅僅爲了去掉或着加上const修飾符號。但是對於本身定義時爲const的類型,即使你去掉const性,在你操作這片內容時候也要小心,只能r不能w操作,否則還是會出錯。
const char* p = "123";
char* c = const_cast<char*>(p);
c[0] = 1;  //表面上通過編譯去掉了const性,但是操作其地址時系統依然不允許這
//麼做。這是一個漏洞吧
<4> dynamic_cast運算符號
Scott Mayers將其描述爲用來執行繼承體系中:安全的向下轉型或者跨系轉型動作。也就是說你可以,用dynamic_cast將 指向base class的指針或引用轉型爲 指向子類的對象的指針或引用。
class B {};  //polymorphic類型含virtual才能dynamic_cast
class D: public B {}
void f( B* pb )
{
    D* pd1 = dynamic_cast<D*>(pb);//如果pb爲d類型正確返回,如果不是返回0
    D* pd2 = static_cast<D*>(pb); //不管怎麼樣都返回指針有可能指向不合適的對
//象,因爲static僅僅靜態檢測,不能得到運
//行時對象的信息是否真正爲D類型
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章