分析 C++中的強制類型轉化

C++中有4種強制轉換:const_cast,static_cast, dynamic_cast, reinterpret_cast,以下將分別介紹:

 

1. const_cast:

形式const_cast<type>(expression),用來修改類型的const或volatile屬性,除了const或volatile修飾以外,type與expression類型一樣;

它主要用於移除const:

將(const)pointer-to-const轉化爲(const)pointer-to-nonconst;

將referece-to-const轉化爲reference-to-nonconst;

不能將const對象轉換爲nonconst對象,

如不可以這樣:const i=1; int j=const_cast<int>(i);

但可以直接:int j=i;

2. static_cast:

形式static_cast < type> ( expression ),將expression轉換爲type類型。

沒有運行時類型檢查來保證轉換的安全性。

它主要用於:

基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum;注意static_cast<char>(intvar)與static<char&>(intvar)之間的區別:前者創建了一個臨時變量,而後者創建了一個引用,該引用綁定到當前對象intvar上;

將non-const轉換爲const對象;有時候需要將nonconst明確轉換爲const對象,以調用因const而重載的函數或成員函數,例如在非const成員函數中調用const成員函數,需要:static<const someclass&>(*this).constfunction(…);

類層次結構中基類和子類之間對象、指針或引用的轉換,注意 進行下行轉換(把基類對象、指針或引用轉換成子類表示)時,由於沒有動態類型檢查,所以是不安全的。

把任意類型的空指針轉換爲另一種類型的空指針;

把任何類型的指針轉換爲void類型或反過來。

3. dynamic_cast:

形式dynamic_cast < type > ( expression ),將expression轉換爲type類型。

dynamic_cast在運行時會動態檢查,比static_cast更安全。

用於:

繼承關係中的基類和派生類之間的指針或引用的變換,特別是能用dynamic_cast把指向基類的指針或引用轉換成指向其派生類或其兄弟類的指針或引用;沒有繼承關係,指針和引用也可以被轉換,只要指針或引用指向或引用的對象具有至少一個虛函數,如:可以把任何一個指向具有虛函數對象的指針轉換爲void* 或const void*或volatile void*,結果是生成的指針將指向“原指針指向對象內存”的開始處。

如果expression實際動態指向或引用的對象類型確實是type,則成功,否則失敗;失敗的轉換將返回空指針(當對指針進行類型轉換時)或者拋出異常(當對引用進行類型轉換時)。

4. reinterpret_cast:

形式reinpreter_cast <type>(expression),將expression轉換爲type形式。主要是用於將一個類型的指針轉換爲另一個類型的指針,如函數指針。

編譯時靜態檢查,而且一般不具有移植性,應慎用。

用於:將一種類型的指針或者引用轉換爲另一種類型的指針或引用;將指針轉換爲整型,或將整型轉換爲指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還可以得到原先的指針值)。

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