int a = 10;
double d = static_casta;
static_cast:用於基本型別和繼承關係的轉換,更改變數內部表示(最常用)
reinsterpret_cast:將指標解釋為另一種指標,不修改指標指向的資料(指標)
const_cast:去除const
dynamic_cast:繼承類物件的指標或引用的轉換(執行時)
一,stcti_cast
用於基本型別和繼承關係的轉換,更改變數內部表示。
static_cast允許執行任意的隱式轉換和相反轉換動作
相反轉換動作:更改變數內部表示
int a = 10;
double c = static_casta;//基本型別的轉換
class base ;
class derived :public based;
base *a = new base;
derived *b = static_cast(derived) a;//繼承關係的轉換
二,reinterpret_cast
將指標解釋為另一種指標,不修改指標指向的資料。
只能作用於指標。
這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。
//基本型別指標的型別轉換
double d=9.2;
double* pd = &d;
int *pi = reinterpret_cast(pd); //相當於int *pi = (int*)pd;
//不相關的類的指標的型別轉換
class a{};
class b{};
a* pa = new a;
b* pb = reinterpret_cast(pa); //相當於b* pb = (b*)pa;
//指標轉換為整數
long l = reinterpret_cast(pi); //相當於long l = (long)pi;
三,const_cast
↵去除或新增常量屬性
const int* pci = 0;
int* pk = const_cast(pci); //相當於int* pk = (int*)pci;
const a* pca = new a;
a* pa = const_cast(pca); //相當於a* pa = (a*)pca;
四,dynamic_cast
繼承類物件的指標或引用的轉換。
與其他3種不同的是:這種轉換是在執行時進行轉換分析的,其他3種在編譯時進行。
轉換是否失敗,可通過是否為null檢測,引用轉換失敗則丟擲乙個bad_cast異常。
class base{};
class derived : public base{};
//派生類指標轉換為基類指標
derived *pd = new derived;
base *pb = dynamic_cast(pd);
if (!pb)
cout << "型別轉換失敗" << endl;
//沒有繼承關係,但被轉換類有虛函式
class a(virtual ~a();) //有虛函式
class b{}:
a* pa = new a;
b* pb = dynamic_cast(pa);
C 四種型別轉換方式
c風格的強制型別轉換 type case 很簡單,不管什麼型別的傳統轉換都是 type b type a,但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間進行轉換,比如你可以把乙個指向const型別的指標轉換成指向非const型別的指標,把乙個指向基類物件...
C 四種型別轉換方式
reinterpert cast意圖執行低階轉換,實際動作 及結果 可能取決於編譯器,這也就表示它不可移植。例如將乙個 pointer to int 轉型為乙個 int 這一型別在底層 以外很少見。示例 class a class b a a new a b b reinterpret a rein...
C 四種型別轉換方式
static cast 靜態型別轉換。reinterpreter cast 重新解釋型別轉換。dynamic cast 子類和父類之間的多型型別轉換。const cast 去掉const屬性轉換 這應該四種中是最常見的。用法為 static cast expression 該運算子把 express...