reinterpret_cast用在任意指標(或引用)型別之間的轉化,以及指標與足夠大的整數型別之間的轉化,從整數型別(包括列舉型別)到指標型別,無視大小。
作用及原理:將乙個型別的指標,轉換為另乙個型別的指標,這種轉換不用修改指標變數值資料存放格式(不改變指標變數值),只需在編譯時重新解釋指標的型別就可以,當然他也可以將指標轉換成整型值,但不能做非指標型別轉換
#include#includeusing
namespace
std;
intmain()
;
class
b{};
a* pa = new
a; b* pb = reinterpret_cast(pa);
//poniter convertedto integer
long j = reinterpret_cast(pi);
return0;
}
const_cast
作用及原理:用於去除指標變數的常量屬性,將它轉換為乙個對應的指標型別的普通變數,當然,也可以將乙個非常量的指標變數轉換為乙個常指標變數。這種轉換在編譯期間。
#include#includeusing
namespace
std;
intmain()
static_cast
作用原理:主要用於基本型別之間和具有繼承關係的型別之間的轉換。
#include#includeusing
namespace
std;
intmain()
;
class derived:public
base{};
derived d;
base b=static_cast(d);//
將子類物件賦值給父類物件
return0;
}
dynamic_cast
作用及其原理:dynamic_cast轉換是動態轉換,這種轉換是在執行時進行轉換分析,而不是在編譯時期進行,這是區別以上三種轉化的一處。
dynamic_cast只能在繼承類物件的指標之間或引用之間進行轉換,進行轉換時,會根據當前執行物件的執行型別資訊(rtti),判斷型別物件之間的轉換是否合法。dynamic_cast的指標轉換失敗,可通過是否為null指標來檢測。
#include#includeusing
namespace
std;
intmain()
;
class derived:public
base{};
derived* pd = new derived; //
子類指標轉化為父類指標
base* pc = dynamic_cast(pd);
if(!pc)
else
//沒有繼承關係,但被轉換的類有虛函式
class a}; //
有虛函式
class
b{};
a* pa = new
a; b* pb = dynamic_cast(pa);
if (!pb)
else
return0;
}
執行結果:
ubuntu@ubuntu:~/wangqinghe/c++/20200120$ g++ dynamic_cast.cpp -o dynamic_cast
ubuntu@ubuntu:~/wangqinghe/c++/20200120$ ./dynamic_cast
converted success
converted error. incldue virtual
沒有繼承關係的類之間轉換,如果轉換的類中有虛函式,編譯器會通過,但是轉化失敗。
總結:
reinterpret_cast 適用於指標轉換為另一種指標。允許將任何指標型別轉換為其他型別。
const_cast 適用於常指標變數,可以使指標變數變為非常指標變數。
static_cast 主要用於基本型別轉換和擁有繼承關係變數之間的轉換。
dynamic_cast 只能在繼承物件的指標之間或引用之間進行型別轉換。
主要:標頭檔案包含在#include中。
C 型別轉化
c 型別轉化 在理解c 型別轉換前,我們先回顧c語言中型別轉換。c風格的強制型別轉化很簡單,不管什麼型別轉換統統是 type b type a。但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間轉換,比如你可以把乙個指向const物件的指標轉換成指向非con...
c 型別轉化
資料型別轉換 隱式轉換 int age 10 double sum age int salary 150000 decimal money salary double speed 10.4f float minspeed float speed string num 123 int n int.pa...
C 型別轉化
const char a 必須const 因為 hello 存在常量區,為唯讀 string str hello str 1 s pass a str.c str a 1 s fail 報錯 唯讀,指標指向常量區char a a 11 int b atoi a cout string str to ...