1> static_cast運算符可用於諸如將指向基類的指針轉換爲指向派生類的指針之類的操做。這種轉換並不老是安全的。express
2> 一般,當你要將數字數據類型(如枚舉轉換爲整數或整數)轉換爲浮點數時,你可使用static_cast,而且您肯定轉換中涉及的數據類型。 static_cast轉換不像dynamic_cast轉換那樣安全,由於static_cast沒有 運行時類型檢查,而dynamic_cast有。對模糊指針的dynamic_cast將失敗,而static_cast則返回,就好像沒有錯誤同樣;這可能很危險。安全
3> dynamic_cast轉換更安全,dynamic_cast僅適用於指針或引用,運行時類型檢查是開銷。函數
總結:dynamic_cast比static_cast更安全;使用static_cast時要作到心中有數。指針
例子:對象
class B {}; class D : public B {}; void f(B* pb, D* pd) { D* pd2 = static_cast<D*>(pb); // not safe, pb may point to just B B* pb2 = static_cast<B*>(pd); // safe conversion }
第一個轉換就是危險的,若是pb指向的是B類的對象,將它強制轉換成派生類D的指針pd2,若使用pd2調用派生類D獨有的方法,就會出問題。blog
class B { public: virtual void Test(){} }; class D : public B {}; void f(B* pb) { D* pd1 = dynamic_cast<D*>(pb); D* pd2 = static_cast<D*>(pb); } 若是pb真的指向D類對象,pd1和pd2值同樣; B* pb = new D(); f(pb);
若是pb指向B類對象,pd1 == NULL,pd2可能被轉換成指向B類的指針,由於dynamic_cast有動態類型檢查。 B* pb = new B(); f(pb);
總結:繼承
2. reinpreter_caststring
例子:it
std::vector<std::wstring> vecMonitorArray; EnumDisplayMonitors(NULL, NULL, &MyInfoEnumProc, reinterpret_cast<LPARAM>(&vecMonitorArray));
把wstring類型指針轉換成long_ptr。
說明:該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾以外, type_id和expression的類型是同樣的。io
class B{ public: i nt m_iNum; } void foo(){ const B b1; b1.m_iNum = 100; //comile error B b2 = const_cast<B>(b1); b2. m_iNum = 200; //fine }
上面的代碼編譯時會報錯,由於b1是一個常量對象,不能對它進行改變;使用const_cast把它轉換成一個常量對象,就能夠對它的數據成員任意改變。注意:b1和b2是兩個不一樣的對象。