(type) expression
例子:
int firstNumber, secondNumber; double result = ((double)firstNumber)/secondNumber;
1.static_cast 在功能上基本上與 C 風格的類型轉換一樣強大,含義也一樣。
double result = static_cast(firstNumber)/secondNumber;
它也有功能上限制。例如,你不能用 static_cast 象用 C 風格的類型轉換一樣把 struct 轉換成 int 類型或者把 double 類型轉換成指針類型,另外,static_cast 不能從表達式中去除 const 屬性,因為另一個新的類型轉換操作符 const_cast 有這樣的功能。
2.const_cast 用於類型轉換掉表達式的 const 或 volatileness 屬性。通過使用 const_cast,你向人們和編譯器強調你通過類型轉換想做的只是改變一些東西的 constness 或者 volatileness 屬性。
class Widget { ... }; class SpecialWidget: public Widget { ... }; void update(SpecialWidget *psw); SpecialWidget sw; // sw 是一個非 const 對象。 const SpecialWidget& csw = sw; // csw 是 sw 的一個引用 // 它是一個 const 對象 update(&csw); // 錯誤!不能傳遞一個 const SpecialWidget* 變量 // 給一個處理 SpecialWidget*類型變量的函數 update(const_cast(&csw)); // 正確,csw 的 const 被顯示地轉換掉( // csw 和 sw 兩個變量值在 update //函數中能被更新) update((SpecialWidget*)&csw); // 同上,但用了一個更難識別 //的 C 風格的類型轉換 Widget *pw = new SpecialWidget; update(pw); // 錯誤!pw 的類型是 Widget*,但是 // update 函數處理的是 SpecialWidget*類型 update(const_cast (pw)); // 錯誤!const_cast 僅能被用在影響 // constness or volatileness 的地方上。, // 不能用在向繼承子類進行類型轉換。
顯然,const_cast 最常見的用途就是將某個對象的常量性去除掉。
3.dynamic_cast 用於安全地沿著類的繼承關系向下進行類型轉換。這就是說,你能用 dynamic_cast 把指向基類的指針或引用轉換成指向其派生類或其兄弟類的指針或引用,而且你能知道轉換是否成功。失敗的轉換將返回空指針(當對指針進行類型轉換時)或者拋出異常(當對引用進行類型轉換時)Widget *pw; ... update(dynamic_castdynamic_casts 在幫助你浏覽繼承層次上是有限制的。它不能被用於缺乏虛函數的類型上(參見條款 M24),也不能用它來轉換掉 constness。(pw)); // 正確,傳遞給 update 函數一個指針 // 是指向變量類型為 SpecialWidget 的 pw 的指針 // 如果 pw 確實指向一個對象, // 否則傳遞過去的將使空指針。 void updateViaRef(SpecialWidget& rsw); updateViaRef(dynamic_cast (*pw)); //正確。 傳遞給 updateViaRef 函數 // SpecialWidget pw 指針,如果 pw // 確實指向了某個對象 // 否則將拋出異常
int firstNumber, secondNumber; double result = dynamic_cast4.reinterpret_cast 的轉換結果幾乎都是執行期定義( implementation-defined 。 因 此 ,使用reinterpret_casts 的代碼很難移植。reinterpret_casts 的最普通的用途就是在函數指針類型之間進行轉換。(firstNumber)/secondNumber; // 錯誤!沒有繼承關系 const SpecialWidget sw; update(dynamic_cast (&sw)); // 錯誤! dynamic_cast 不能轉換掉 const。
例如,假設你有一個函數指針數組:
typedef void (*FuncPtr)(); // FuncPtr is 一個指向函數的指針,該函數沒有參數,返回值類型為 void FuncPtr funcPtrArray[10]; // funcPtrArray 是一個能容納10 個 FuncPtrs 指針的數組讓我們假設你希望(因為某些莫名其妙的原因)把一個指向下面函數的指針存入funcPtrArray 數組:int doSomething();
funcPtrArray[0] = &doSomething; // 錯誤!類型不匹配reinterpret_cast 可以讓你迫使編譯器以你的方法去看待它們:
funcPtrArray[0] = // this compiles reinterpret_cast(&doSomething);
轉換函數指針的代碼是不可移植的(C++不保證所有的函數指針都被用一樣的方法表示),在一些情況下這樣的轉換會產生不正確的結果(參見條款 M31),所以你應該避免轉換函數指針類型。
總結一下就是:
static_cast 和 C 風格的強制類型轉換類似,除了不能把struct轉換為int、double轉化為指針類型這樣;
const_cast 用於改變const和volatileness屬性,常見的是去掉const屬性(把const對象轉為非const);
dynamic_cast 用於類繼承關系的向下轉換,但不能用於缺乏虛函數的類型;
reinterpret_cast 的轉換結果是執行期定義的。