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

字號:

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)換成功與否的標志)