c 四種強制型別轉換

2021-09-29 02:45:45 字數 2651 閱讀 2766

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

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

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

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

一、static_cast轉換

1.基本用法:static_castexpression

2.使用場景:

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

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

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

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

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

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

3.使用特點

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

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

二、dynamic_cast轉換

1.基本用法:dynamic_castexpression

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

3.使用特點:

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

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

c、dynamic_cast還可以進行交叉轉換

三、const_cast轉換

1.基本用法:const_castexpression

2.使用場景:

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

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

3.使用特點:

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

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

四、reinterpret_cast轉換

1.基本用法:reinterpret_castexpression

2.使用場景:不到萬不得已,不用使用這個轉換符,高危操作

3.使用特點:  

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

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

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

五、各種轉換之間的比較

1.static_cast和dynamic_cast

class base

public:

int _c;

};class derived:public base

;int main(void)

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

2.static_cast和reinterpret_cast

class basea

int _c;

};class baseb

int _d;

};int main(void)

{ basea basea;

/*1.編譯不過*/

baseb *baseb = static_cast(&basea);

/*2.無任何編譯告警,編譯通過,正常執行*/

baseb *basec = reinterpret_cast(&basea);

cout<_d

C 四種強制型別轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...

C 四種強制型別轉換

1 概述 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。2 詳解加示例 a const cast 用法 const cast 型別 表示式 用途 刪除con...

C 四種強制型別轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...