3.1 static_cast
用法:static_cast < type-id > ( exdivssion )
該運算符把exdivssion轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:
①用於類層次結構中基類和子類之間指針或引用的轉換。
進行上行轉換(把子類的指針或引用轉換成基類表示)是安全的;
進行下行轉換(把基類指針或引用轉換成子類表示)時,由於沒有動態類型檢查,所以是不安全的。
②用於基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
③把空指針轉換成目標類型的空指針。
④把任何類型的表達式轉換成void類型。
注意:static_cast不能轉換掉exdivssion的const、volitale、或者__unaligned屬性。
3.2 dynamic_cast
用法:dynamic_cast < type-id > ( exdivssion )
該運算符把exdivssion轉換成type-id類型的對象。Type-id必須是類的指針、類的引用或者void *;
如果type-id是類指針類型,那么exdivssion也必須是一個指針,如果type-id是一個引用,那么exdivssion也必須是一個引用。
dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。
在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;
在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
class B { public: int m_iNum; virtual void foo(); }; class D : public B { public: char *m_szName[100]; }; 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則沒有這個限制。
這是由於運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函數表(
關於虛函數表的概念,詳細可見)中,只有定義了虛函數的類才有虛函數表,
沒有定義虛函數的類是沒有虛函數表的。