C++與型別轉換相關的4個關鍵字
轉自http://blog.csdn.net/xmu_jupiter/article/details/42456307
首先,C++與型別轉換相關的四個關鍵字有:const_cast, static_cast, dynamic_cast, reinterpret_cast.
什麼是型別轉換?
表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。但是在C++中,某些型別之間存在相關的依賴關係。若兩種型別相關,則可在需要某種型別的運算元位置上,使用該型別的相關型別物件或值。如果兩個型別之間可以相互轉換,則稱這兩個型別相關。
那麼,第一個關鍵字登場了,static_cast關鍵字就是提供這種場合下的型別轉換。C++預設的整數型別之間的轉換就屬於這種。
與之相反,如果被轉換的兩種型別之間不相關,比如int指標轉換為char指標,就要使用reinterpret_cast這個關鍵字。
接下來登場的是const_cast。 使用const_cast會消除被轉換型別的const特性,而且只有const型別的變數才能使用。那麼,什麼情況下需要消除一個const變數的const特性呢?比如,有時候有的函式的形參型別為非const型別,那麼如果你要將一個const型別的引數傳入就會報錯。所以在這種情況下需要先使用const_cast轉化一下。
最後,就剩下dynamic_cast了。它是一種作執行時(run-time)檢測的型別轉換。它可以將基類型別的指標或引用安全地轉換為派生型別的指標或引用。當具有基類的引用或指標,但需要執行不是基類組成部分的派生類操作的時候,需要動態的強制型別轉換。通常,從基類指標獲得派生類行為最好的方法是通過虛擬函式。當使用虛擬函式的時候,編譯器自動根據物件的實際型別選擇正確的函式。但是,在某些情況下,不可能使用虛擬函式。這時候就需要使用dynamic_cast關鍵字了。但是,能用虛擬函式還是用虛擬函式最好。
與其他強制型別轉換不同,dynamic_cast涉及執行時型別檢查。如果繫結到引用或指標的物件不是目標型別的物件,則dynamic_cast失敗。
補充:
在上面四個型別轉化關鍵字中,除了static_cast,其他的三個都有可能涉及到指標的型別轉換。從本質上來說,指標的型別不同,並沒有產生很大的差異,他們都是需要足夠的記憶體來存放一個機器地址。“指向不同型別之各指標”間的差異,既不在其指標表示法不同,也不在其內容(代表一個地址)不同,而是在其所定址出來的object不同。也就是說,“指標型別”會教導編譯器如何解釋某個特定地址中的記憶體內容及其大小。
所以,轉換(cast)其實是一種編譯器指令。大部分情況下它並不改變一個指標所含的真正地址,它隻影響“被指出之記憶體大小和其內容”的解釋方式。