1. 程式人生 > >c++ 轉型詳解

c++ 轉型詳解

以前對c++的轉型也看過好幾篇文章,基本用法都比較熟悉。但要說下更詳細的,未免就捉襟見肘。寫篇文章來總結下。
static_cast
1.可用於基本型別的轉換, 這一點比較簡單,不贅述。
2.用於向下型別的轉換,常用於父類轉子類。不進行型別檢查,所以這是不安全的。舉個例子來理解下:

#include<iostream>

class A
{
public:
    virtual void hello()
    {
        std::cout << "hello::A" << std::endl;
    }
};

class B
:public A { public: virtual void hello() { std::cout << "hello::B" << std::endl; } }; int main() { A a = A(); B* b = static_cast<B*>(&a); if (b == NULL) { std::cout << "Cast failed" << std::endl; return 0; } b-
>hello(); return 0; }

B是A的子類, 將A 轉型為B的時候沒有進行型別檢查。 最後輸出的結果是 ”hello::A“,即轉型沒有轉成功。導致的問題是和我們預期的結果不同。所以在編寫複雜程式的時候,無法進行型別檢查。 因此出的問題也比較難定位。

dynamic_cast
dynamic_cast 主要用於指標的轉換。常用於向下轉型。 比起static_cast, 型別之間的轉換有優勢。 會進行型別檢查。若轉換值為指標型別,轉型失敗會返回NULL。
若上例使用 dynamic_cast,

B* b = dynamic_cast<B*>(&a)

得到的結果就是輸出 cast failed.
總結下,當父類指標轉換為子類的時候,dynamic_cast 更為合適,其他static_cast。

reinterpret_cast
和c語言的強轉類似。可用於整數到指標的轉換,也可用於指標到整數的轉換。這個是static_cast 無法辦到的。
所以 reinterpret_cast 功能更強大。