**:
c++即支援c風格的型別轉換,又有自己風格的型別轉換。c風格的轉換格式很簡單,但是有不少缺點的:
1.轉換太過隨意,可以在任意型別之間轉換。你可以把乙個指向const物件的指標轉換成指向非const物件的指標,把乙個指向基類物件的指標轉換成乙個派生類物件的指標,這些轉換之間的差距是非常巨大的,但是傳統的c語言風格的型別轉換沒有區分這些。
2.c風格的轉換沒有統一的關鍵字和標示符。對於大型系統,做**排查時容易遺漏和忽略。
c++風格完美的解決了上面兩個問題。1.對型別轉換做了細分,提供了四種不同型別轉換,以支援不同需求的轉換;2.型別轉換有了統一的標示符,利於**排查和檢視。下面分別來介紹這四種轉換:static_cast、dynamic_cast、const_cast和reinterpre_cast.
一、static_cast轉換
1.基本用法:static_castexpression
2.使用場景:
a、用於類層次結構中基類和派生類之間指標或引用的轉換
上行轉換(派生類---->基類)是安全的;
下行轉換(基類---->派生類)由於沒有動態型別檢查,所以是不安全的。
b、用於基本資料型別之間的轉換,如把int轉換為char,這種帶來安全性問題由程式設計師來保證
c、把空指標轉換成目標型別的空指標
d、把任何型別的表示式轉為void型別
3.使用特點
a、主要執行非多型的轉換操作,用於代替c中通常的轉換操作
b、隱式轉換都建議使用static_cast進行標明和替換
二、dynamic_cast轉換
1.基本用法:dynamic_castexpression
2.使用場景:只有在派生類之間轉換時才使用dynamic_cast,type-id必須是類指標,類引用或者void*。
3.使用特點:
a、基類必須要有虛函式,因為dynamic_cast是執行時型別檢查,需要執行時型別資訊,而這個資訊是儲存在類的虛函式表中,只有乙個類定義了虛函式,才會有虛函式表(如果乙個類沒有虛函式,那麼一般意義上,這個類的設計者也不想它成為乙個基類)。
b、對於下行轉換,dynamic_cast是安全的(當型別不一致時,轉換過來的是空指標),而static_cast是不安全的(當型別不一致時,轉換過來的是錯誤意義的指標,可能造成踩記憶體,非法訪問等各種問題)
c、dynamic_cast還可以進行交叉轉換
三、const_cast轉換
1.基本用法:const_castexpression
2.使用場景:
a、常量指標轉換為非常量指標,並且仍然指向原來的物件
b、常量引用被轉換為非常量引用,並且仍然指向原來的物件
3.使用特點:
a、cosnt_cast是四種型別轉換符中唯一可以對常量進行操作的轉換符
b、去除常量性是乙個危險的動作,盡量避免使用。乙個特定的場景是:類通過const提供過載時,一般都是非常量函式呼叫const_cast將引數轉換為常量,然後呼叫常量函式,然後得到結果再呼叫const_cast 去除常量性。
四、reinterpret_cast轉換
1.基本用法:reinterpret_castexpression
2.使用場景:不到萬不得已,不用使用這個轉換符,高危操作
3.使用特點:
a、reinterpret_cast是從底層對資料進行重新解釋,依賴具體的平台,可移植性差
b、reinterpret_cast可以將整型轉換為指標,也可以把指標轉換為陣列
c、reinterpret_cast可以在指標和引用裡進行肆無忌憚的轉換
五、各種轉換之間的比較
1.static_cast和dynamic_cast
class base
public:
int _c;
};class derived:public base
;int main(void)
在基類派生類互相轉換時,雖然static_cast是在編譯期完成,效率更高,但是不安全,上例中就示範了乙個踩記憶體的例子。相比之下因為dynamic_cast可以檢視執行時資訊,上例如果base含有虛函式,那麼drvptrb就是乙個空指標(這可比踩記憶體什麼的好多了),不能操作derived中_d的資料從而保證安全性,所以應該優先使用dynamic_cast。
2.static_cast和reinterpret_cast
class basea
int _c;
};class baseb
int _d;
};int main(void)
static_cast雖然也不是一種絕對安全的轉換,但是它在轉換時,還是會進行必要的檢測(諸如指標越界計算,型別檢查)。reinterpret_cast完全是肆無忌憚,直接從二進位制開始重新對映解釋,是極度不安全的,再次提醒,不到萬不得已,不要使用
c 四種強制轉換
c 同時提供了四種新的強制轉型形式 通常稱為新風格的或 c 風格的強制轉型 const cast expression dynamic cast expression reinterpret cast expression static cast expression 每一種適用於特定的目的 con...
C 四種強制轉換
c 的四種強制型別轉換,所以c 不是型別安全的。分別為 static cast dynamic cast const cast reinterpret cast 為什麼使用c風格的強制轉換可以把想要的任何東西轉換成合乎心意的型別。那為什麼還需要乙個新的c 型別的強制轉換呢?新型別的強制轉換可以提供更...
C 四種強制轉換
c 的四種強制型別轉換,所以c 不是型別安全的。分別為 static cast dynamic cast const cast reinterpret cast。為什麼使用c風格的強制轉換可以把想要的任何東西轉換成合乎心意的型別。那為什麼還需要乙個新的c 型別的強制轉換呢?新型別的強制轉換可以提供更...