1. 程式人生 > >static_cast與dynamic_cast區別

static_cast與dynamic_cast區別

C語言型別轉換

C語言提供了隱式轉換,顯式轉換。

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

C++型別轉換

C++ 繼承了C中的隱式和顯式轉換的額方式。但這種轉換並不是安全和嚴格的,加上C++ 本身物件模型的複雜性,C++增加了四個顯式轉換的關鍵字。

static_cast, dynamic_cast, const_cast, reinterpret_cast

上行轉換:子類指標轉換為父類指標。
下行轉換:父類指標轉換為子類指標。

static_cast

static_cast可以做上述隱式轉換的事,可以部分的做顯式轉換的事,也可以進行繼承層次的轉換。它沒有執行時型別檢查來保證轉換的安全性。上行轉換時沒有問題,但是它的下行轉換是不安全的。

dynamic_cast

dynamic_cast幾乎唯一的被用來處理多型。

多型分為上行轉換和下行轉換。
上行轉換沒問題,子類的指標肯定可以轉換成父類指標。

對於下行轉換,如要要把父類的指標 A 轉換成子類的指標 B ,如果 A 指向的是子類的物件,轉換沒問題。
但是,如果 A 指向的是父類的物件,正確的做法是轉換應該為不成功的,因為多型裡沒有子類的指標指向父類的物件的。

所以,對於 A 指向的是父類的物件,現要把 A 轉成 B 的情況,如果採用 static_cast,不會報錯,返回的是轉換後的指標,但程式此時是不安全的。
如果採用 dynamic_cast ,它會根據虛擬函式表找到 A 指向的是什麼物件(這裡要求父類必須要有虛擬函式,否則報錯),如果是父類物件,返回 NULL ,如果使子類物件,返回轉換後的指標,程式此時是安全的。
所以這裡就是 dynamic_cast 和 static_cast 最大的區別。

const_cast

常量指標被轉換為非常量指標,並且仍然指向原來的物件;
常量引用被轉換為非常量引用,並且仍然指向原來的物件;
常量物件轉換為非常量物件。

reinterpret_cast

這個操作符能夠在非相關的型別之間轉換。

操作結果只是簡單的從一個指標到別的指標的值得二進位制拷貝。

在型別之間不做任何型別的檢查和轉換。