C++基礎(chǔ):C++提供了四個(gè)顯式數(shù)據(jù)類型轉(zhuǎn)換函數(shù)

字號(hào):

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)志)