強制型別轉換

2021-06-23 01:43:43 字數 1397 閱讀 6910

顯式轉換也稱為強制型別轉換(cast),包括以下列名字命名的強制型別轉換操作符:static_cast、dynamic_cast、const_cast 和 reinterpret_cast。

命名的強制型別轉換符號的一般形式如下:

cast-name(expression);

其中 cast-name 為 static_cast、dynamic_cast、const_cast 和reinterpret_cast 之一,type 為轉換的目標型別,而 expression 則是被強制轉換的值。強制轉換的型別指定了在 expression 上執行某種特定型別的轉換。

const_cast ,將轉換掉表示式的 const 性質。

const char *pc_str="123";

char *pc = const_cast(pc_str);

cout<

只有使用 const_cast 才能將 const 性質轉換掉。在這種情況下,試圖使用其他三種形式的強制轉換都會導致編譯時的錯誤。類似地,除了新增或刪除const 特性,用 const_cast 符來執行其他任何型別轉換,都會引起編譯錯誤。

編譯器隱式執行的任何型別轉換都可以由 static_cast 顯式完成:

double d = 97.0;

// cast specified to indicate that the conversion is intentional

char ch = static_cast(d);

可以使用 dynamic_cast 操作符將基類型別物件的引用或指標轉換為同一繼承層次中其他型別的引用或指標。與 dynamic_cast 一起使用的指標必須是有效的——它必須為 0 或者指向乙個物件。

與其他強制型別轉換不同,dynamic_cast 涉及執行時型別檢查。如果繫結到引用或指標的物件不是目標型別的物件,則 dynamic_cast 失敗。如果轉換到指標型別的 dynamic_cast 失敗,則 dynamic_cast 的結果是 0 值;如果轉換到引用型別的 dynamic_cast 失敗,則丟擲乙個 bad_cast 型別的異常。

因此,dynamic_cast 操作符一次執行兩個操作。它首先驗證被請求的轉換是否有效,只有轉換有效,操作符才實際進行轉換。一般而言,引用或指標所繫結的物件的型別在編譯時是未知的,基類的指標可以賦值為指向派生類物件,同樣,基類的引用也可以用派生類物件初始化,因此,dynamic_cast 操作符執行的驗證必須在執行時進行。

強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...

強制型別轉換

c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dynamic cast,命名上理解是動態型別轉換。如子類和父類之間的多型型別轉換。reinterprete...

強制型別轉換

如果運算子兩邊的資料型別不統一,則較低型別的需要轉化成較高型別,再參加運算。運算子的高低如下 char,short int unsigned long double float include include int main 執行結果 int f 5 f 5.97 強制型別轉換的格式如下 型別 資...