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