4個類型轉換相關的關鍵字,類型轉換關鍵字
分別是
static_cast、const_cast、reinterpret_cast、dynamic_caststatic_cast
任何具有明確定義的類型轉換,只要不包含底層const,都可以使用static_cast。在編譯期間處理,但是沒有運行時類型的檢測來保證轉換的安全性。在C++中,某些類型之間存在相關的依賴關係。若兩種類型相關,則可在需要某種類型的運算元位置上,使用該類型的相互關聯類型對象或值。如果兩個類型之間可以相互轉換,則稱這兩個類型相關。static_cast就是處理這種類型相關的轉換。
reinterpret_cast
與之相反,類型不相關之間的類型轉換就用reinterpret_cast,reinterpret_cast通常為運算對象的位元模式提供較底層次上的重新解釋。比如int和char之間的轉換。
const_cast
使用const_cast會消除被轉換類型的const特性,而且只有const類型的變數才能使用。那麼,什麼情況下需要消除一個const變數的const特性呢?比如,有時候有的函數的形參類型為非const類型,那麼如果你要將一個const類型的參數傳入就會報錯。所以在這種情況下需要先使用const_cast轉化一下。“去掉const性質”只用於改變常量屬性。
dynamic_cast
它是一種作運行時(run-time)檢測的類型轉換。它可以將基類類型的指標或引用安全地轉換為衍生類別型的指標或引用。當具有基類的引用或指標,但需要執行不是基類組成部分的衍生類別操作的時候,需要動態強制類型轉換。通常,從基類指標獲得衍生類別行為最好的方法是通過虛函數。當使用虛函數的時候,編譯器自動根據對象的實際類型選擇正確的函數。但是,在某些情況下,不可能使用虛函數。這時候就需要使用dynamic_cast關鍵字了。但是,能用虛函數還是用虛函數最好。與其他強制類型轉換不同,dynamic_cast涉及運行時類型檢查。如果綁定到引用或指標的對象不是目標類型的對象,則dynamic_cast失敗。dynamic_cast 失敗的時候,如果要轉的是指標,返回null 指標;如果是引用,拋 std::bad_cast
dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
classB{public:int m_iNum;virtual void foo();};classD:publicB{public:char* m_szName[100];};void func(B* pb){D* pd1=static_cast<D*>(pb);D* pd2=dynamic_cast<D*>(pb);}
在上面的程式碼片段中,如果 pb 指向一個 D 類型的對象,pd1 和 pd2 是一樣的,並且對這兩個指標執行 D 類型的任何操作都是安全的;但是,如果 pb 指向的是一個 B 類型的對象,那麼 pd1 將是一個指向該對象的指標,對它進行 D 類型的操作將是不安全的(如訪問 m_szName),而 pd2 將是一個null 指標。
另外要注意:B 要有虛函數,否則會編譯出錯;static_cast則沒有這個限制。
這是由於運行時類型檢查需要運行時類型資訊,而這個資訊儲存在類的虛函數表(關於虛函數表的概念,詳細可見
查看評論