1. 程式人生 > >C++ static_cast和dynamic_cast的區別

C++ static_cast和dynamic_cast的區別

網上也看到了一些相關的總結,總覺得他們總結的不太好,還是按照自己的理解寫一寫吧。


C語言型別轉換:
          C語言提供了隱式轉換,顯示轉換。通過這兩種方式,C語言中大部分的型別轉換都可以順利進行。至於能不能進行轉換,轉換後的結果如何,編譯器不管,需要使用者自己去控制。


C++型別轉換:
         C++繼承了C中的隱式和顯式轉換的方式。但這種轉換並不是安全和嚴格的,加上C++本身物件模型的複雜性,C++增加了四個顯示轉換的關鍵字。(C++是強型別語言)
(static_cast,dynamic_cast,const_static,reinterpret_cast)
         static_cast可以做上述隱式轉換的事,可以部分的做顯式轉換的事,也可以進行繼承層次的轉換。它沒有執行時型別檢查來保證轉換的安全性。它的上行轉換時沒問題的,但是它的下行轉換時不安全的。
          dynamic_cast幾乎唯一的被用來處理多型。多型分為上行轉換和下行轉換,上行轉換沒問題,子類的指標肯定可以轉換成父類指標。下行轉換就有問題了,如果要把父類的指標A轉換成子類的指標B,如果A指向的是子類的物件,這樣轉沒問題。但是,如果A指向的是父類的物件,正確的做法是轉換應該為不成功的,因為多型裡沒有子類的指標指向父類的物件的。所以,在“A指向的是父類的物件,現要把A轉成B”這種情況下,如果採用static_cast,不會報錯,返回的是轉換後的指標,但程式此時是不安全的。如果採用dynamic_cast,它會根據虛擬函式表找到A指向的是什麼物件(這裡要求父類必須要有虛擬函式,否則報錯),如果是父類物件,返回NULL,如果是子類物件,返回轉換後的指標,程式此時是安全的。所以,這就是dynamic_cast和static_cast最大的區別。
          const_cast。常量指標被轉化成非常量指標,並且仍然指向原來的物件;常量引用被轉換成非常量引用,並且仍然指向原來的物件;常量物件被轉換成非常量物件。
         reinterpret_cast。這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從一個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。