C 中四種強制型別轉換區別詳解

2021-10-07 07:18:56 字數 2152 閱讀 9707

c++即支援c風格的型別轉換,又有自己風格的型別轉換。c風格的轉換格式很簡單,但是有不少缺點的:

1.轉換太過隨意,可以在任意型別之間轉換。你可以把乙個指向const物件的指標轉換成指向非const物件的指標,把乙個指向基類物件的指標轉換成乙個派生類物件的指標,這些轉換之間的差距是非常巨大的,但是傳統的c語言風格的型別轉換沒有區分這些。

2.c風格的轉換沒有統一的關鍵字和標示符。對於大型系統,做**排查時容易遺漏和忽略。

c++風格完美的解決了上面兩個問題。1.對型別轉換做了細分,提供了四種不同型別轉換,以支援不同需求的轉換;2.型別轉換有了統一的標示符,利於**排查和檢視。下面分別來介紹這四種轉換:static_cast、dynamic_cast、const_cast和reinterpre_cast.

用於類層次結構中基類和派生類之間指標或引用的轉換

上行轉換(派生類---->基類)是安全的;

下行轉換(基類---->派生類)由於沒有動態型別檢查,所以是不安全的。

用於基本資料型別之間的轉換,如把int轉換為char,這種帶來安全性問題由程式設計師來保證

把空指標轉換成目標型別的空指標

把任何型別的表示式轉為void型別

主要執行非多型的轉換操作,用於代替c中通常的轉換操作

隱式轉換都建議使用static_cast進行標明和替換

只有在派生類之間轉換時才使用dynamic_cast,type-id必須是類指標,類引用或者void*。

基類必須要有虛函式,因為dynamic_cast是執行時型別檢查,需要執行時型別資訊,而這個資訊是儲存在類的虛函式表中,只有乙個類定義了虛函式,才會有虛函式表(如果乙個類沒有虛函式,那麼一般意義上,這個類的設計者也不想它成為乙個基類)。

對於下行轉換,dynamic_cast是安全的(當型別不一致時,轉換過來的是空指標),而static_cast是不安全的(當型別不一致時,轉換過來的是錯誤意義的指標,可能造成踩記憶體,非法訪問等各種問題)

dynamic_cast還可以進行交叉轉換

常量指標轉換為非常量指標,並且仍然指向原來的物件

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

cosnt_cast是四種型別轉換符中唯一可以對常量進行操作的轉換符

去除常量性是乙個危險的動作,盡量避免使用。乙個特定的場景是:類通過const提供過載時,一般都是非常量函式呼叫const_cast將引數轉換為常量,然後呼叫常量函式,然後得到結果再呼叫const_cast 去除常量性。

編譯時就會進行型別轉換的檢查。重新解釋(將操作內容解釋為另一種不同的型別)

不到萬不得已,不用使用這個轉換符,高危操作

常用轉換:

將乙個整型(位址)轉換成指標,一種指標轉換成另一種指標,按照轉換後的內容重新解釋記憶體中的內容。

將乙個指標型別轉換成乙個整型。

reinterpret_cast是從底層對資料進行重新解釋,依賴具體的平台,可移植性差

reinterpret_cast可以將整型轉換為指標,也可以把指標轉換為陣列

reinterpret_cast可以在指標和引用裡進行肆無忌憚的轉換

class

base

public

: int _c;};

class

derived

:public base

;int main

(void

)

在基類派生類互相轉換時,雖然static_cast是在編譯期完成,效率更高,但是不安全,上例中就示範了乙個踩記憶體的例子。相比之下因為dynamic_cast可以檢視執行時資訊,上例如果base含有虛函式,那麼drvptrb就是乙個空指標(這可比踩記憶體什麼的好多了),不能操作derived中_d的資料從而保證安全性,所以應該優先使用dynamic_cast。

class

basea

int _c;};

class

baseb

int _d;};

int main

(void

)

static_cast雖然也不是一種絕對安全的轉換,但是它在轉換時,還是會進行必要的檢測(諸如指標越界計算,型別檢查)。reinterpret_cast完全是肆無忌憚,直接從二進位制開始重新對映解釋,是極度不安全的,再次提醒,不到萬不得已,不要使用。

C 四種強制型別轉換詳解

型別轉換的含義是通過改變乙個變數的型別為別的型別從而改變該變數的表示方式。為了型別轉換乙個簡單物件為另乙個物件你會使用傳統的型別轉換操作符。c中 複製 如下 t element 或者 t element c 中 複製 如下 reinterpret cast expression dynamic ca...

解析C 中四種強制型別轉換的區別詳解

c 的四種強制型別轉換,所以c 不是型別安全的。分別為 static cast dynamic cast const cast reinterpret cast 為什麼使用c風格的強制轉換可以把想要的任何東西轉換成合乎心意的型別。那為什麼還需要乙個新的c 型別的強制轉換呢?新型別的強制轉換可以提供更...

C 中四種強制型別轉換的區別

static cast 用法static cast old 將old 轉換成type型別 可以是類型別,基本型別之間的轉換 但沒有執行時型別檢查來保證安全性,基類不需要有虛函式,當把派生類轉化成基類指標型別時,是安全的,但把基類轉化成派生類時,不會進行動態型別檢查 注意 static cast 不能...