C/C++之類型強制轉化

強制轉化四種類型可能不少人都經常忽略就象我同樣,可是有時仍是比較有用的。不瞭解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓你們看看。
                                                            2004-11-27 9:00c++

強制轉化不管從語法仍是語意上看,都是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類型
}

反正你們在使用知道怎麼用就ok了,c++強制轉化在模板中仍是很是有用的,其餘時候本人也喜歡用c的轉化方便。^_^     安全

相關文章
相關標籤/搜索