在c++中,提供了四種型別轉換,static_cast、dynamic_cast、 reinterp_cast、const_cast。當然,如果你要用()強轉也行,c++是相容c的。
static_cast< type-id > ( expression )
常常用於下面幾種情況:
一、用於類層次結構中基類和子類之間指標或引用的轉換。包括進行上行轉換(把子類的指標或引用轉換成基類表示)是安全的;進行下行轉換(把基類指標或引用轉換成子類指標或引用)時,由於沒有動態型別檢查,所以是不安全的。
二、 用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
三、 把void指標轉換成目標型別的指標(不安全!!) 把任何型別的表示式轉換成void型別。
dynamic_cast檢查型別的安全的轉換, 無法完成的轉換會返回null(轉換指標)或者丟擲異常(轉換引用). 效率較低。比如把父類物件指標轉換成子類指標就會返回null。有這樣的特性,有時候我們可以利用它來判斷某個指標指向的物件是哪個物件。
例子://crect是cshape的子類,cshape是基類
crect* p1 = new crect;
cshape* p2 = new cshape;
p1 = dynamic_cast_cast(p2); //基類轉化為子類,為下行,不安全。結果會返回null
if(p1==null)
printf("空指標p1");//結果顯示:空指標null
如:p2 = dynamic_cast_cast(p1); //子類轉化為基類,為上行,安全。結果不會返回null
if(p1==null)
printf("空指標p1");//無顯示
reinterp_cast簡單的轉換,萬能的轉換。也是危險的,程式設計師得自己保證它的安全。
const_cast用來修改型別的const或volatile屬性。
用法:const_cast(expression)
該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。
常量指標被轉化成非常量指標,並且仍然指向原來的物件;
常量引用被轉換成非常量引用,並且仍然指向原來的物件;常量物件被轉換成非常量物件。
class b{
public:
int m_inum;
void foo(){
const b b1;
b1.m_inum = 100; //comile error
b b2 = const_cast(b1);
b2. m_inum = 200; //fine
上面的**編譯時會報錯,因為b1是乙個常量物件,不能對它進行改變;
使用const_cast把它轉換成乙個非常量物件,就可以對它的資料成員任意改變。注意:b1和b2是兩個不同的物件。
c 四種型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 四種型別轉換
include include includeusing namespace std static cast 用法 static cast type id expression 該運算子把expression轉換為type id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法 用於...
C 四種型別轉換
1 static cast 1.上行轉換,把派生類的指標或引用轉換成基類,此時是安全的 2.下行轉換,把基類的指標或者引用轉換成派生類,因為沒有動態監測,所以是不安全的 3.顯示型別轉換,如int轉float等 4.任意型別空指標轉任意型別空指標 5.任意型別表示式轉為void型別 如下 int a...