C++強制型別轉換

qq_35609583發表於2020-12-05

******1、C風格
“()” 大法
C語言強轉比較簡單,只需要將想要轉換的型別名加到原型別變數名之前就可以了;
******2、C++風格
C++提供了4種新的強制型別轉換形式(通常稱為新風格的或C++風格的強制轉 型):const_cast(你要轉的型別)、dynamic_cast( )、 reinterpret_cast()和 static_cast(),每一種都適用於特定的目的,具體如下:

(1)dynamic_cast 主要用於執行“安全的向下轉型(safe downcasting)”,也就是說,要確定一個物件是否是一個繼承體系中的一個特定型別。支援父類指標到子類指標的轉換,這種轉換時最安全的轉換。它 是唯一不能用舊風格語法執行的強制型別轉換,也是唯一可能有重大執行時代價的強制轉換。

(2)static_cast 可以被用於強制隱形轉換(例如,non-const物件轉換為const物件,int轉型為double,等等),它還可以用於很多這樣的轉換的反向轉換 (例如,void*指標轉型為有型別指標,基類指標轉型為派生類指標),但是它不能將一個const物件轉型為non-const物件(只有 const_cast能做到),它最接近於C-style的轉換。應用到類的指標上,意思是說它允許子類型別的指標轉換為父類型別的指標(這是一個有效的隱式轉換),同時,也能夠執行相反動作:轉換父類為它的子類。

在此例中,被轉換的父類沒有被檢查是否與目的型別相一致。
程式碼:
class Base {
};

class Derived : public Base {
};

Base *a = new Base;
Derived *b = static_cast<Derived *>(a);

'static_cast’除了操作型別指標,也能用於執行型別定義的顯式的轉換,以及基礎型別之間的標準轉換:
程式碼:
double d = 3.14159265;
int i = static_cast(d);
執行結果: i = 3;

(3)const_cast一般用於強制消除物件的常量性。它是唯一能做到這一點的C++風格的強制轉型。這個轉換能剝離一個物件的const屬性,也就是說允許你對常量進行修改。

程式碼:
class Constant{

};
const Constant *a = new C;
Constant *b = const_cast<C *>(a);
此時的

(4)reinterpret_cast 是特意用於底層的強制轉型,導致實現依賴(就是說,不可移植)的結果,例如,將一個指標轉型為一個整數。這樣的強制型別在底層程式碼以外應該極為罕見。操作結果只是簡單的從一個指標到別的指標的值得二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。

******3、兩者關係
舊風格的強制轉型依然合法(C語言風格),但是新的形式更可取。
例如:有的編譯器將不認同你所作的強制型別轉換而報錯(試圖使用一個const_cast以外的新風格 強制轉型來消除常量性,程式碼將無法編譯)
還有就是在程式碼的迭代中使開發者更容易識別,這樣就簡化了在程式碼中尋找型別系統被破壞的地方的過程;

相關文章