C++的static_cast、dynamic_cast和const_cast用法

static_cast、dynamic_cast和const_cast

static_cast:

​ 用法:express

static_cast < type-id > (expression)安全

​ 把expression強制轉換爲type-id類型,可是沒有運行時類型檢查。多用於void*的轉換。函數


dynamic_cast:

​ 用法:指針

dynamic_cast < type-id > (expression)code

​ 把expression強制轉換爲type-id類型,運行時進行類型檢查。對象

特性:繼承

  1. ​ 在類層次間進行上行轉換(派生類的指針或引用轉換爲基類)時,dynamic_caststatic_cast的效果是同樣的;在進行下行轉換時,dynamic_cast具備類型檢查的功能,比static_cast更安全。io

  2. dynamic_cast支持交叉轉換。基類A有兩個直接派生類B、C,那麼,將B* pB轉換爲C* pC,這種由派生類B轉換到派生類C的轉換稱之爲交叉轉換。這種狀況下只能使用dynamic_cast編譯

  3. dynamic_cast支持多繼承ast

    設有兩個基類A一、A2,派生類B從A一、A2中派生。

    那麼,將pB轉換爲pA1或是pA2,此時只能使用dynamic_caststatic_cast是沒法實現此功能的。
    即:單繼承狀況下,dynamic_caststatic _cast效果是相同的;多繼承狀況下,只能使用dynamic_cast

下行轉換中:

//B是基類,D是派生類
void func(B *pb)
{
    D *pd1 = static_cast(pb);
    D *pd2 = dynamic_cast(pb);
}

在上面的代碼段中,若是pb指向一個D類型的對象,pd1和pd2是同樣的,而且對這兩個指針執行D類型的任何操做都是安全的;
可是,若是pb指向的是一個B類型的對象,那麼pd1將是一個指向該對象的指針,對它進行D類型的操做將是不安全的(如訪問m_szName),
而pd2將是一個空指針。
另外:B要有虛函數,不然會編譯出錯,可是static_cast沒有這個限制


const_cast:

​ 用法:

const_cast < type-id > (expression)

​ 把常量指針轉化爲很是量指針,而且仍然指向原來的對象;常量引用被轉換成很是量引用,而且仍然指向原來的對象;常量對象被轉換成很是量對象。

相關文章
相關標籤/搜索