1 reinterpret_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)
reinterpret_cast類型轉(zhuǎn)換函數(shù)將一個(gè)類型的指針轉(zhuǎn)換成另一個(gè)類型的指針。這種轉(zhuǎn)換不用于修改指針變量值數(shù)據(jù)存放的格式(不改變指針變量值),只需在編譯期間重新解釋指針的類型就可以做到。
reinterpret_cast可以將指針值轉(zhuǎn)換為一個(gè)整型數(shù)。但是不能用于非指針類型的轉(zhuǎn)換,否則將不會(huì)通過編譯。
什么時(shí)候使用reinterpret_cast進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換:
(1)將基本類型指針轉(zhuǎn)換成另一個(gè)類型的指針。
例如:
基本類型指針的轉(zhuǎn)換
double d = 9.3;
double *pd = &d;
int *pi = reinterpret_cast(pd);//相當(dāng)于隱式轉(zhuǎn)換int * pi = (int *)pd;
(2)將一個(gè)類的指針轉(zhuǎn)換為另一個(gè)類的指針。
類指針類型的轉(zhuǎn)換:
class A{};
class B{};
A* pa = new A;
B* = reinterpret_ castpa;
(3)不能轉(zhuǎn)換非指針類型
例如:
將int類型轉(zhuǎn)換為float類型時(shí)是不能夠轉(zhuǎn)換成功的
int i = 8;
double dl = reinterpret_cast(i);
(4)不能將一個(gè)const指針轉(zhuǎn)換成void*類型的指針
const int* pci = 0;
void *pv = reinterpret_cast(pci);
2 const_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)
const_cast用于去除指針變量的常量屬性,將它轉(zhuǎn)換為一個(gè)對(duì)應(yīng)指針類型的普通變量,反過來,也可以將一個(gè)非常量的指針變量轉(zhuǎn)換為常量指針變量。這種轉(zhuǎn)換是在編譯期間作出的類型更改。
(1)將常量指針變量轉(zhuǎn)換為對(duì)應(yīng)指針類型的普通變量
const int *pci = 0;
int* pj = const_cast(pci);//相當(dāng)于隱式轉(zhuǎn)換int* pj = (int*)pci;
(2)將普通指針變量轉(zhuǎn)換為一個(gè)常指針變量
int* pi =0;
const int* pcj = const_cast(pi);//相當(dāng)于隱式轉(zhuǎn)換const int* = (int*)pi
(3)將類的常指針變量轉(zhuǎn)換為類的普通指針變量
const A* pca = new A;
A* pa = const_cast(pca);//相當(dāng)于隱式轉(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(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)
stactic_cast主要用于基本類型之間和具有繼承關(guān)系的類型之間的轉(zhuǎn)換,這種轉(zhuǎn)換一般會(huì)改變變量的內(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)繼承類與基類指針進(jìn)行轉(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(在運(yùn)行期間實(shí)現(xiàn)轉(zhuǎn)換,并可以返回轉(zhuǎn)換成功與否的標(biāo)志)
reinterpret_cast類型轉(zhuǎn)換函數(shù)將一個(gè)類型的指針轉(zhuǎn)換成另一個(gè)類型的指針。這種轉(zhuǎn)換不用于修改指針變量值數(shù)據(jù)存放的格式(不改變指針變量值),只需在編譯期間重新解釋指針的類型就可以做到。
reinterpret_cast可以將指針值轉(zhuǎn)換為一個(gè)整型數(shù)。但是不能用于非指針類型的轉(zhuǎn)換,否則將不會(huì)通過編譯。
什么時(shí)候使用reinterpret_cast進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換:
(1)將基本類型指針轉(zhuǎn)換成另一個(gè)類型的指針。
例如:
基本類型指針的轉(zhuǎn)換
double d = 9.3;
double *pd = &d;
int *pi = reinterpret_cast
(2)將一個(gè)類的指針轉(zhuǎn)換為另一個(gè)類的指針。
類指針類型的轉(zhuǎn)換:
class A{};
class B{};
A* pa = new A;
B* = reinterpret_ castpa;
(3)不能轉(zhuǎn)換非指針類型
例如:
將int類型轉(zhuǎn)換為float類型時(shí)是不能夠轉(zhuǎn)換成功的
int i = 8;
double dl = reinterpret_cast
(4)不能將一個(gè)const指針轉(zhuǎn)換成void*類型的指針
const int* pci = 0;
void *pv = reinterpret_cast
2 const_cast(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)
const_cast用于去除指針變量的常量屬性,將它轉(zhuǎn)換為一個(gè)對(duì)應(yīng)指針類型的普通變量,反過來,也可以將一個(gè)非常量的指針變量轉(zhuǎn)換為常量指針變量。這種轉(zhuǎn)換是在編譯期間作出的類型更改。
(1)將常量指針變量轉(zhuǎn)換為對(duì)應(yīng)指針類型的普通變量
const int *pci = 0;
int* pj = const_cast
(2)將普通指針變量轉(zhuǎn)換為一個(gè)常指針變量
int* pi =0;
const int* pcj = const_cast
(3)將類的常指針變量轉(zhuǎn)換為類的普通指針變量
const A* pca = new A;
A* pa = const_cast(pca);//相當(dāng)于隱式轉(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(在編譯期間實(shí)現(xiàn)轉(zhuǎn)換)
stactic_cast主要用于基本類型之間和具有繼承關(guān)系的類型之間的轉(zhuǎn)換,這種轉(zhuǎn)換一般會(huì)改變變量的內(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)繼承類與基類指針進(jìn)行轉(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(在運(yùn)行期間實(shí)現(xiàn)轉(zhuǎn)換,并可以返回轉(zhuǎn)換成功與否的標(biāo)志)