**
首先,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)其實是一種編譯器指令。大部分情況下它並不改變乙個指標所含的真正位址,它只影響「被指出之記憶體大小和其內容」的解釋方式。
C 中4個與型別轉換相關的關鍵字
static cast const cast dynamic cast reinterpret cast 表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。在c 中,某些型別之間存在相關的依賴關係。若兩種型別相關,則可在需要某種型別的運算元位置上,使用該型別的相關型別物件或...
c 中4個與型別轉換相關的關鍵字分析
static cast reinterpret cast dynamic cast const cast 1.static cast 運算子完成相關型別之間的轉換 使用場景 如在同一類層次結構中的乙個指標型別到另乙個指標型別,整型到列舉型別,或者浮點型到整型等。例 1,int m 10 double...
C 中4個與型別轉換相關的關鍵字( cast)
在c c 語言中用 type value 在c 還可以採用type value 來進行顯式型別轉換 explicit type conversion 常常又被稱為強制轉換 cast投射 鑄模 這種轉換的正確性完全掌握在程式設計師手中,傳統上強制轉換往往被過度使用,成為c 程式犯錯的乙個主要根源。為了...