1. 程式人生 > >C++中的4種類型轉換方式

C++中的4種類型轉換方式

static_cast 靜態的_cast
dynamic_cast 動態的_cast
reinterpret_cast 重新解釋的 _cast
const_cast 常量的_cast


C++ 裡最好杜絕使用 C 方式的強制轉換, 換用以上 4 個.
我們通常用的是 static_cast
在一類東西都可以轉, 但是不是一類的就不能轉.
即, 語義上說不通的, 兩個完全不同的資料型別 static_cast
是拒絕工作的.
比如你想把一個指標轉成浮點數,
或者想把 class A * 轉成 class B * , 但是 class A 和 class B
又沒有任何關係. 等等....

static_cast 在通過編譯後, 空間和時間效率實際等價於 C 方式強制轉換.
都是編譯時決定的.

dynamic_cast 類似 static_cast, 但是在一顆類繼承樹上轉換時,
將利用 RTTI 在執行時檢查. 我們一般用於 downcast

比如,
class A {};
class B : public A {};

A* a=new B();

這個時候, 可以用 dynamic_cast 做 downcast, 把 a 轉成 B*.
和 static_cast 不同, dynamic_cast 會檢查一下 a 到底是不是指向一個
B, (利用了 RTTI) 如果轉不了, 將返回一個 NULL.

reinterpret_cast 就比 static_cast 更接近 C 的強制轉換了.
它更進一步的, 實現一些看起來沒關係的兩種型別轉換.
比如我習慣乾的, 把一個 void * 轉成 unsigned ;)
當然它比 static_cast 危險.

但是有 reinterpret_cast 幹不了的,
比如你在一個 const 成員函式裡企圖修改一個非 mutable 的成員變數.
編譯器會對你咆哮, "不許動, 那玩意是我 const 住的, 把你的爪子
收回去" 這個時候就要利用 const_cast 了, 呵呵.

const_cast 就是可以解除 const 限制的"神"的武器
但我認為, 這在很多情況下比 reinterpret_cast 更危險, 我還是老實做
人的好. 讓編譯器來捍衛我的程式碼的安全.