1 reinterpret_cast(在編譯期間實現轉換)
reinterpret_cast類型轉換函數將一個類型的指針轉換成另一個類型的指針。這種轉換不用於修改指針變量值數據存放的格式(不改變指針變量值),只需在編譯期間重新解釋指針的類型就可以做到。
reinterpret_cast可以將指針值轉換為一個整型數。但是不能用於非指針類型的轉換,否則將不會通過編譯。
什麼時候使用reinterpret_cast進行數據類型的轉換:
(1)將基本類型指針轉換成另一個類型的指針。
例如:
基本類型指針的轉換
double d = 9.3;
double *pd = &d;
int *pi = reinterpret_cast<int *>(pd);//相當於隱式轉換int * pi = (int *)pd;
(2)將一個類的指針轉換為另一個類的指針。
類指針類型的轉換:
class A{};
class B{};
A* pa = new A;
B* = reinterpret_ cast<B*>pa;
(3)不能轉換非指針類型
例如:
將int類型轉換為float類型時是不能夠轉換成功的
int i = 8;
double dl = reinterpret_cast<double>(i);
(4)不能將一個const指針轉換成void*類型的指針
const int* pci = 0;
void *pv = reinterpret_cast<void*>(pci);
2 const_cast(在編譯期間實現轉換)
const_cast用於去除指針變量的常量屬性,將它轉換為一個對應指針類型的普通變量,反過來,也可以將一個非常量的指針變量轉換為常量指針變量。這種轉換是在編譯期間作出的類型更改。
(1)將常量指針變量轉換為對應指針類型的普通變量
const int *pci = 0;
int* pj = const_cast<int*>(pci);//相當於隱式轉換int* pj = (int*)pci;
(2)將普通指針變量轉換為一個常指針變量
int* pi =0;
const int* pcj = const_cast<const int*>(pi);//相當於隱式轉換const int* = (int*)pi
(3)將類的常指針變量轉換為類的普通指針變量
const A* pca = new A;
A* pa = const_cast<A*>(pca);//相當於隱式轉換A* pa = (A*)pca;
(4)無法將非指針的常變量轉換為普通變量,無法將非指針的普通變量轉換為常變量。
int i =0;
const int cj = const_cast<const int>(i);//非指針轉換,不能通過編譯
(5)但可以通過隱式轉換將非指針的普通變量轉換為常變量。
int i = 0;
const int ck = (const int)(i);
3 stactic_cast(在編譯期間實現轉換)
stactic_cast主要用於基本類型之間和具有繼承關系的類型之間的轉換,這種轉換一般會改變變量的內部表示方式,因此static_cast用於指針的轉換沒有太大的意義。即使允許指針類型的轉換,也不及reinterprret轉換的效率高。
(1)基本類型之間的轉換
int i =0 ;
double d = static_cast<double int>();
(2)繼承類型轉換為基類
class Base{};
class Derived :public Base{};
Derived d;
Base b = static_cast<Base>(d);
(3)繼承類與基類指針進行轉換編譯能通過,但是基類轉換為繼承類指針具有一定的危害性
Dereived* pd = new Derived ;
Base *pb = static_cast<Base*>(pd);
(4)不能使用static_cast轉換基本類型的指針
int* pi = 0;
double* pd = static_cast<double>(pi);
(5)不能把基類轉換為繼承類或轉換無繼承關系的類的指針
4 dynamic_cast(在運行期間實現轉換,並可以返回轉換成功與否的標志)