一、reinterpret_cast: 是特意用於底層的強制轉型,導致實現依賴(implementation-dependent)(不可移植)的結果,
例如,將一個指標轉型為一個整數。
string a;
double *b=static_cast<double*>(&a);
cout<<b<<" "<<&a<<endl; //結果只是指標到指標(地址)的拷貝,b和&a地址一樣
還有一些自己定義的對象,等只要是資料差異大均可..
class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);
cout<<a<<b<<endl; //結果地址一樣
二、static_cast :可以被用於強制隱型轉換(例如,non-const 對象轉型為 const 對象,int 轉型double,等),它還可以用於很多這樣的轉換的反向轉換(例如,void* 指標轉型為有類型指標,基類指標轉型為衍生類別指標),但是它不能將一個 const 對象轉型為 non-const 對象(只有 const_cast 能做到),它最接近於C-style的轉換。
class Base {};
class Derived : public Base {};
Base *a = new Base;
Derived *b = reinterpret_cast<Derived *>(a); (轉換子類到父類,相反也可.)
//上面程式也可用reinterpret_cast類型轉換,因為屬兩個不同類.資料類型差異大
static_cast除了操作指標外,也可以操作資料,類似以前簡單類型轉換
,如
double a=1.111;
int b=static_cast<int>(a);
三、const_cast: 一般用於強制消除對象的常量性。它是唯一能做這一點的 C++ 風格的強制轉型。
const int a=10;
int *b= const_cast<int*>(&a);
*b=9;
cout<<*b<<endl; //可以更改常量了.9
下面是類的常量指標轉為非常量指標
class C {};
const C *a = new C;
C *b = const_cast<C *>(a);
四、dynamic_cast: 主要用於執行“安全的向下轉型(safe downcasting)”,將基類類型的指標或引用安全地轉換為衍生類別型的指標或引用。
當用於多態類型時。dynamic_cast會檢查操作是否有效,static_cast不可檢測,檢測在運行時進行。
1. 如果被轉換的指標不是一個被請求的有效完整的對象指標,傳回值為0.如下:
class Base { virtual void dummy() {} };
class Derived : public Base { };
Base *basePtr=new Derived;
Base *basePtr2=new Base;
if (Derived *derivedPtr = dynamic_cast<Derived*>(basePtr))//第二種情況basePtr改為basePtr2;
{ //BasePtr points at a Derived object
cout<<"success"<<endl;
} else { // BasePtr points at a Base object
cout<<"BasePtr points at a Base object"<<endl;
}
//上面的程式用static_cast也可,只是沒有檢測,第二個指標是無效的...,
//用reinterprep_cast也可,也沒檢測,不建議...最易出錯
分析上面的程式,basePtr一開始建立了一個Derived類的空間, if強制轉換過程中空間一致,輸出success.
而basePtr2一開始建立一個Base空間,而後來強制轉換時空間不一致,輸出 第2個語句
2. 如果一個參考型別執行了類型轉換並且這個轉換是不可能的,一個bad_cast的異常類型被拋出,如下:
Derived d1;
Base temp;
Base &b1=d1;
Base &b2=temp;
try
{
Derived d2 = dynamic_cast<Derived &>(b1); //第二種情況的話,b1改為b2
cout<<"success"<<endl;
}
catch (bad_cast)
{
cout<<"exception..."<<endl;
}
引用作用跟指標的作用差不多...