為什麼c++要引入static_cast、dynamic_cast、const_cast、reinterpret_cast
用隱式和使用者定義轉換的組合在型別間轉換
比如:
int i, j;
// 舊式的
double ret =((
double
)i)/j;
// 推薦的
double ret =
static_cast
<
double
>
(i)/j;
static_cast在功能上與c風格的型別一樣強大,含義也一樣,只是限制比c風格大一點。比如不能從表示式中去除const屬性
static_cast
< 新型別 >
( 表示式 )
返回新型別
的值
只有下列轉換在不去除常量性和易變性的場合才能用 static_cast 執行。
(1)下面情況類似新型別 temp(表示式)
所初始化的乙個虛構變數 temp,它可能涉及隱式轉換,對 新型別 的建構函式的呼叫,或對使用者定義轉換運算子的呼叫。
對於非引用的 新型別,static_cast 純右值表示式的結果物件是其直接初始化的物件。 (c++17 起)
(2) 如果新型別是指向某類型別 d 的指標或引用,且 表示式 的型別是其非虛基類 b 的左值或指向它的指標純右值,則 static_cast 進行向下轉型(downcast)。
struct b
;struct d : b
;d d;
b& br = d;
static_cast
>
(br)
;// 該左值指代原來的 d 物件
(3)c++11起,如果新型別是右值引用型別,則 static_cast 將泛左值、類純右值或陣列純右值 (c++17 前)任何左值 (c++17 起) 表示式 的值轉換為與該表示式指代相同物件,或指代其基類子物件(取決於 新型別)的亡值。
(4)如果新型別是(可為 cv 限定的)void 型別,則 static_cast 在求值表示式後捨棄其值。
(5)如果存在從新型別到表示式型別的標準轉換序列,且它不包含左值到右值、陣列到指標、函式到指標、空指標、空成員指標、函式指標 (c++17 起)或布林轉換,則 static_cast 能進行該隱式轉換的逆轉換。
(6) 如果從表示式到新型別的轉換涉及左值到右值、陣列到指標或函式到指標轉換,則 static_cast 可以顯式執行該轉換。
(7)有作用域列舉型別(c++11)能轉換成整數或浮點型別。
(8)整數或列舉型別值可轉換為任何完整列舉型別。
浮點型別的值也可轉換為任何完整列舉型別。
(9)指向某類 d 的成員的指標可以向上轉型(upcast)為指向其無歧義、可訪問的基類 b 的成員。這種 static_cast 不檢查所指向物件的執行時型別是否包含該成員。
(10)指向(可為 cv 限定的)void 的指標型別的純右值可轉換到指向任何物件的指標型別。如果原指標值所表示的記憶體中位元組位址不滿足目標型別的對齊要求,則結果指標值未指明。否則,如果原指標值指向物件 a,且存在與 a 指標可互轉換(定義於下文)的目標型別(忽略 cv 限定)的物件 b,則結果為指向 b 的指標。否則指標值不改變。任何指標轉換到 void 指標再轉換回原(或更為 cv 限定的)型別的指標,都保持其原值。
同所有轉型表示式,結果是:
滿足以下條件時,兩個物件 a 與 b 指標可互轉換(pointer-interconvertible):
union u u;
void
* x =
&u;// x 的值為「指向 u 的指標」
double
* y =
static_cast
<
double
*>
(x);
// y 的值為「指向 u.b 的指標」
char
* z =
static_cast
<
char
*>
(x);
// z 的值為「指向 u 的指標」
只有當型別轉換有所定義,整個轉換才會成功。
#include
#include
#include
#include
using
namespace std;
intmain()
static_cast也能用於通過進行到指定型別的函式的指標轉換,來消解函式過載的歧義,比如:
C C 學習 之四 static cast
用法 static cast type id expression c primer 第四版 中說編譯器隱式執行的任何型別轉換都可以由static cast顯式完成!要注意的是,此轉換沒有執行時檢測安全!他不能轉換掉expression的const volatile 或者 unaligned屬性。他...
static cast與c風格的強制型別轉換比較
class a class b class c public a int main 編譯直接報錯 cast.cpp in function int main cast.cpp 22 31 error invalid static cast from type b to type a cast.cpp...
static cast與c風格的強制型別轉換比較
classa classb class c publica intmain 編譯直接報錯 cast.cpp in function int main cast.cpp 22 31 error invalid static cast from type b to type a cast.cpp 23 ...