C 中的四種強制型別轉換

2021-06-22 05:22:07 字數 1848 閱讀 9357

什麼是c風格轉換?

強制型別轉換是通過型別轉換運算來實現的。其一般形式為:(型別說明符)(表示式)其功能是把表示式的運算結果強制轉換成型別說明符所表示的型別。自動轉換是在源型別和目標型別相容以及目標型別廣於源型別時發生乙個型別到另一類的轉換。例如: (float) a 把a轉換為實型,(int)(x+y) 把x+y的結果轉換為整型。

什麼是static_cast, dynamic_cast 以及 reinterpret_cast?區別是什麼?

1)  static_cast

用法:static_cast (expression)

說明:該運算子把expression轉換為typeid型別,但沒有執行時型別檢查來確保轉換的安全性。

用途:a) 用於類層次結構中基類和派生類之間指標或者引用的轉換。up-casting (把派生類的指標或引用轉換成基類的指標或者引用表示)是安全的;down-casting(把基類指標或引用轉換成子類的指標或者引用)是不安全的。

b) 用於基本資料型別之間的轉換,如把int轉換成char,這種轉換的安全性也要由開發人員來保證。

c) 可以把空指標轉換成目標型別的空指標(null pointer)。

d) 把任何型別的表示式轉換成void型別。

注意: static_cast不能轉換掉expression的const、volitale或者__unaligned屬性。

2)dynamic_cast

用法:dynamic_cast (expression)

說明:該運算子把expression轉換成typeid型別的物件。typeid必須是類的指標、類的引用或者void*。如果typeid是類的指標型別,那麼expression也必須是指標,如果typeid是乙個引用,那麼expression也必須是乙個引用。一般情況下,dynamic_cast用於具有多型性的類(即有虛函式的類)的型別轉換。

dynamic_cast依賴於rtti資訊,其次,在轉換時,dynamic_cast會檢查轉換的source物件是否真的可以轉換成target型別,這種檢查不是語法上的,而是真實情況的檢查。先看rtti相關部分,通常,許多編譯器都是通過vtable找到物件的rtti資訊的,這也就意味著,如果基類沒有虛方法,也就無法判斷乙個基類指標變數所指物件的真實型別,這時候,dynamic_cast只能用來做安全的轉換,例如從派生類指標轉換成基類指標。而這種轉換其實並不需要dynamic_cast參與。也就是說,dynamic_cast是根據rtti記載的資訊來判斷型別轉換是否合法的。

用途:主要用於類層次之間的up-casting和down-casting,還可以用於類之間的交叉轉換。在進行down-casting時,dynamic_cast具有型別檢查的功能,比static_cast更安全。檢測在執行時進行。如果被轉換的指標不是乙個被請求的有效完整的物件指標,返回值為null。當用於多型型別時,它允許任意的隱式型別轉換以及相反過程。不過,與static_cast不同,在後一種情況裡(注:即隱式轉 換的相反過程),dynamic_cast會檢查操作是否有效。也就是說,它會檢查轉換是否會返回乙個被請求的有效的完整物件。

注意:dynamic_cast不能轉換掉expression的const、volitale或者__unaligned屬性。

3) reinterpret_cast

用法:reinterpret_cast (expression)

說明:轉換乙個指標為其他型別的指標,也允許將乙個指標轉換為整數型別,反之亦然。這個操作符能夠在非相關的型別之間進行轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝,在型別之間指向的內容不做任何型別的檢查和轉換。這是乙個強制轉換。使用時有很大的風險,慎用之。

注意:reinterpret _cast不能轉換掉expression的const、volitale或者__unaligned屬性。

C 中四種強制型別轉換

c 同時提供了四種新的強制轉型形式 通常稱為新風格的或 c 風格的強制轉型 dynamic cast expression reinterpret cast expression static cast expression const cast const cast 允許新增或刪除指標或引用表示式...

c 中四種強制型別轉換

形式 cast name expression type 是轉換的目標型別,expression 是要轉換的值。任何具有明確定義的型別轉換,只要不包含底層const,都可以使用 static cast。例如double a 3.14 int b 3 int a1 static cast int a ...

C 中的四種強制型別轉換

一 dynamic case 用法 dynamic cast type id expression 條件 type id必須是類的指標 類的引用或者void 如果type id是類指標型別,那麼expression也必須是乙個指標,如果type id是乙個引用,那麼expression也必須是乙個引...