C++四大類型轉換


C++ 是一門強類型語言(相比C++來說C語言是弱類型語言),不同自定義類型之間的轉換必須進行顯式轉換。(C++中也有隱式類型轉換,所以關於C++到底是強類型語言還是弱類型語言是一個比較尷尬的問題。)
C++ 中提供了四種轉換操作符來細分顯式類型轉換。因爲是操作符,所以他們不屬於任何的namespace,也就不用包含任何頭文件就可以使用。

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

1. static_cast


static_cast能進行基礎類型之間的轉換,也是最常看到的類型轉換。它主要有如下幾種用法:

  • 1 . 用於類層次結構中父類和子類之間指針或引用的轉換。進行上行轉換(把子類的指針或引用轉換成父類表示)是安全的;
  • 2 . 進行下行轉換(把父類指針或引用轉換成子類指針或引用)時,由於沒有動態類型檢查,所以是不安全的;
  • 3 . 用於基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
  • 4 . 把void指針轉換成目標類型的指針(不安全!!)
  • 5 . 把任何類型的表達式轉換成void類型。


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

2. const_cast

該運算符用來修改類型的const或volatile屬性。除了去掉const 或volatile修飾之外, type_id和expression得到的類型是一樣的。

注意:const_cast只能改變運算對象的底層const。對於常量對象,使用const_cast會報錯。

const char *pc;
char *p = const_cast<char *>(pc); //正確

3. reinterpret_cast

reinterpret_cast它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還可以得到原先的指針值)。

 int *ip;
 char *pc = reinterpret_cast<char*>(ip);

上述的轉化過程非常危險,因爲一旦在後面的程序中忘記的pc指針指向的是一個int型的數據,對其操作就回引起數據混亂的現象。
注意: reinterpret_cast 很少使用,因爲在reinterpret_cast本質上依賴於機器,要想使用reinterpret_cast必須涉及的類型和編譯器實現轉換的過程都非常瞭解。

4. dynamic_cast

dynamic_cast 主要用在繼承體系中的安全向下轉型。它能安全地將指向基類的指針轉型爲指向子類的指針或引用,並獲知轉型動作成功是否。轉型失敗會返回null(轉型對象爲指針時)或拋出異常(轉型對象爲引用時)。
dynamic_cast 會動用運行時信息(RTTI)來進行類型安全檢查,因此 dynamic_cast 存在一定的效率損失。
注意: dynamic_cast 只有在基類帶有虛函數的情況下才允許將基類轉換爲子類。

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