Q:什麼是C風格轉換?什麼是static_cast, dynamic_cast 以及 reinterpret_cast?差別是什麼?為什麼要注意?
A:轉換的意思是透過改變一個變數的型別為別的型別而改變該變數的表示方式。為了型別轉換一個簡單物件為另一個物件你會使用傳統的型別轉換操作符。
例如,為了轉換一個類型為doubole的浮點數的指針到整數
代碼
int i; double d; i = (int) d;
i = int (d);
reinterpret_cast 轉換一個
reinterpret_cast 轉換一個
reinterpret_cast 轉換一個
reinterpret_cast 轉換一個
reinterpret_cast 轉換一個
reinterpret_cast<new_type>(expression) dynamic_cast<new_type>(expression) static_cast<new_type>(expression) const_cast<new_type>(expression)
class A {}; class B {}; A * a = new A; B * b = reinterpret_cast<B *>(a);
dynamic_cast只用於物件的指標和引用。當用於多態類型時,它允許任意的隱式類型轉換以及相反過程。不過,與static_cast不同,在後一種情況(註:即隱式轉換的相反過程),dynamic_cast會檢查操作是否有效。也就是說,它會檢查轉換是否會回傳一個被要求的有效的完整物件。
檢測在運作時進行。如果被轉換的指針不是一個被請求的有效完整的對象指針,返回值為NULL.
代碼:
class Base {}; class Derived : public Base {}; Base *a = new Base; Derived *b = static_cast<Derived *>(a);
如果一個引用類型執行了類型轉換並且這個轉換是不可能的,一個bad_cast的異常類型被拋出:
代碼:
double d = 3.14159265; int i = static_cast<int>(d);4 const_cast
這個轉換類型操縱傳遞物件的const屬性,或是是移除碼:
class Base { virtual dummy() {} }; class Derived : public Base {}; Base* b1 = new Derived; Base* b2 = new Base; Derived* d1 = dynamic_cast<Derived *>(b1); // succeeds Derived* d2 = dynamic_cast<Derived *>(b2); // fails: returns 'NULL'其它三種操作符是不能修改一個物件的常數性的。注意:’const_cast’也能改變一個類型的volatile qualifier。