C 基礎 10 四種cast轉換的區別

2022-09-04 08:27:10 字數 2082 閱讀 8408

(1)c風格的轉換

(t)expression;
(2)c++風格的四種轉換

static_cast(expression);

dynamic_cast(expression);

reinterpret_cast(expression);

const_cast(expression);

int a = 1;

double d = (double)a;//c風格轉換

一般許多書本會建議使用c++提供的四種型別轉換而不是使用c風格的轉換。

因為c風格的型別轉換有不少的缺點,它可以在任意型別之間轉換,比如你可以把乙個指向const物件的指標轉換成指向非const物件的指標,把乙個指向基類物件的指標轉換成指向乙個派生類物件的指標,這兩種轉換之間的差別是巨大的,但是傳統的c語言風格的型別轉換沒有區分這些。還有乙個缺點就是,c風格的轉換不容易查詢,他由乙個括號加上乙個識別符號組成,而這樣的東西在c++程式裡一大堆。所以c++為了克服這些缺點,引進了4種新的型別轉換操作符。

static_cast(expression);

最常用的轉換,但是轉換的時候不會檢查型別來保證轉換的安全性

class base;

class derived : public base;

void main()

static_cast本質上是傳統c語言強制轉換的替代品。

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

dynamic_cast(expression);

該運算子把expression轉換成t型別的物件。

dynamic_cast轉換操作符在執行型別轉換時首先將檢查能否成功轉換,如果能成功轉換則轉換之,如果轉換失敗,如果是指標則反回乙個0值,如果是轉換的是引用,則丟擲乙個bad_cast異常,所以在使用dynamic_cast轉換之間最好使用if語句對其轉換成功與否進行測試。

注意:(1)t必須是類的指標、類的引用或者void *。如果t是類指標型別,那麼expression也必須是乙個指標,如果t是乙個引用,那麼expression也必須是乙個引用。

(2)dynamic_cast轉換符只能用於含有虛函式的類。

class base;};

class derived : public base

;void main()

dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。

在類層次間進行上行轉換(子類->子類/基類)時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換(基類->子類)時,dynamic_cast具有型別檢查的功能,比static_cast更安全。

interpret是解釋的意思,reinterpret即為重新解釋,此識別符號的意思即為資料的二進位制形式重新解釋,但是不改變其值。

reinterpret_cast(expression);

t必須是乙個指標、引用、算術型別、函式指標或者成員指標。

該操作符用於將一種型別轉換為另一種不同的型別,比如可以把乙個整型轉換為乙個指標,或把乙個指標轉換為乙個整型,因此使用該操作符的危險性較高,一般不應使用該操作符。

示例:

int i;

char *p = "this is a example.";

i = reinterpret_cast(p); //將指標p的值(即位址)轉為int型 【如 0x00b4cd10 -> 11848976】

const_cast(expression);

其中t必須為指標或引用 。

主要是用來去掉const屬性,當然也可以加上const屬性。主要是用前者,後者很少用。

class a

;void main()

C 四種cast轉換

c 中四種型別分別為 static cast dynamic cast const cast reinterpret cast 1.const cast 用於將const變數轉換為非const 2.static cast 用於各種隱式轉換,比如非const轉const,void 轉指標等,也可以用於...

C 中四種cast轉換

c 中四種型別轉換是 static cast,dynamic cast,const cast,reinterpret cast 1 static cast 用於各種隱式轉換,例如將非const轉換為const,void 轉指標 將void指標指向任意型別 等,用於多型向上轉化,如果向下轉能成功但是不...

C 基礎語言之(三C 中四種cast轉換)

說起型別轉換,我們常見的就是c中的隱式型別轉換和顯式型別轉換 1.隱式型別轉換 隱式轉換就是系統預設的 不需要加以宣告就可以進行的轉換。在隱式轉換過程中,編譯器無需對轉換進行詳細檢查就能夠安全地執行轉換。int i 1 float f i 2.顯式型別轉換 強制型別轉換 區別在於當向下轉換時如果不顯...