C++的四種強制類型轉換

前言

      C風格的強制類型轉換(Type Cast)很簡單,不管什麼類型的轉換統統是:TYPE b = (TYPE)a。如

int a=1;
char b=(char)a;

        這種轉換適用於面向過程的沒有類的概念的c語言的轉換,然而這樣的轉換符也能隨意地應用於類和類的指針,沒有安全檢查。

      C++風格的類型轉換提供了4種類型轉換操作符來應對不同場合的應用:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在於控制類(class)之間的類型轉換。
代碼:

reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)

 

static_cast

  用法:static_cast<type_id> (expression)

  該轉換和c風格的轉換很類似,沒有運行時類型檢查,所以無法保證轉換的安全性。主要有以下幾種用法:

  (1)用於基本數據類型,或者non_const到const(反過來必須用const_cast)

  (2)把空指針轉換爲目標類型的指針

  (3)將任何類型的表達式轉換爲void類型

  (4)可以將子類類型的指針轉換爲父類類型的指針(這種轉換的安全性需要開發人員來保證)

       (5) static_cast不能去掉類型的const、volitale屬性(用const_cast)。

 

dynamic_cast

  用法:dynamic_cast<type*>(expression)

  他只用於對象和引用,主要用於執行安全的向下轉型,他可以將指向子類的父類指針轉換爲子類指針,但是要求父類有虛函數,如果轉換爲指針類型失敗則返回NULL,如果是引用類型轉換失敗則跑出bad_cast的異常。

 

關於static_cast 和 dynamic_cast的區別

a. static在轉換時不進行安全性檢查,完全需要開發者自己考慮, dynamic 在轉換的時候會進行安全性檢查,如果是指針類型的轉換失敗返回NULL,如果是引用類型的轉換失敗,則跑出bad_cast 異常。

b. static主要是用於值類型之間的轉換,而dynamic只能用於對象的指針和引用的cast,dynamic是向下的轉換,而且要求父類有虛函數,否則會編譯出錯。

 

const_cast

  用法:const_cast<type_id> (expression)

  用於修改類型的const或volatile屬性,一般用於強制消除對象的常量性,c中不提供消除這const的機制

 

reinpreter_cast

  用法:reinpreter_cast<type_id> (expression)

       type_id可以是指針,引用,算術類型,函數指針或者成員指針,這個操作符可以在非相關的類型之間轉換,操作只是簡單的從一個指針到別的指針的值得二進制拷貝,在類型之間指向的內容不作任何類型的檢查和轉換。

 

總 結

  去const屬性用const_cast。

  基本類型轉換用static_cast。

  多態類之間的類型轉換用daynamic_cast。

  不同類型的指針類型轉換用reinterpreter_cast。

  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章