如果兩種型別相關,則可在需要某種型別的運算元位置上,使用該型別的相關型別物件或值。如果兩個型別之間可以相互轉換,稱這兩個型別相關。
強制型別轉換,又叫顯式轉換,包括四個操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。
一般形式:cast_name(expression);
cast_name:為四種型別轉換之一
type:轉換的目標型別
expression:被強制轉換的值。
1、dynamic_cast
dynamic_cast用於類繼承層次間的指標或引用轉換。主要還是用於執行「安全的向下轉型(safe downcasting)」,也即是基類物件的指標或引用轉換為同一繼承層次的其他指標或引用。至於「先上轉型」(即派生類指標或引用型別轉換為其基類型別),本身就是安全的,儘管可以使用dynamic_cast進行轉換,但這是沒必要的, 普通的轉換已經可以達到目的,畢竟使用dynamic_cast是需要開銷的。
不同於其它的強制型別轉換,dynamic_cast在執行時會進行型別檢查,如果繫結到引用或指標的物件不是目標型別的物件,則dynamic_cast失敗:
注意:dynamic_cast在將父類cast到子類時,父類必須要有虛函式。
2、const_cast
轉換掉表示式的const性質。例如,假設有函式string_copy,我們對其唯一的char*型別的引數唯讀不寫。在訪問該函式時,最好的選擇是修改它讓它接受const char*型別的引數。如果不行,可通過const_cast:
const char * pc_str;
char *pc = string_copy(const_cast(pc_str) );
使用const_cast將const性質轉換掉。
除了新增或刪除const特性,用const_cast符來執行其它型別轉換,都會引起編譯錯誤。
3、static_cast
編譯器隱式執行的任何型別轉換都可以由static_cast顯式完成:
double d = 29.70;
char ch = static_cast(d);
當需要將乙個較大的算術型別賦值給較小的型別時,使用強制型別轉換非常有效。此時,強制型別轉換告訴程式的讀者和編譯器:我們知道並且不關心潛在的精度損失。對於從乙個較大的算術型別到乙個較小型別的賦值,編譯器通常會產生警告。當顯示提供強制型別轉換時,警告資訊會被關閉。
如果編譯器不提供自動轉換,使用static_cast也是非常有用的。例如:可通過static_cast將存放在void*中的指標值強制轉換為原來的指標型別:
void * p = &d;
double * dp = static_cast(p);
4、reinterpret_cast
static_cast 運算子完成*相關型別*之間的轉換. 而 reinterpret_cast 處理*互不相關的型別*之間的轉換.
"互不相關的型別"指的是兩種完全不同的型別,如從整型到指標型別,或者從乙個指標到另乙個毫不相干的指標.
所以 reinterpret_cast 常常被用作不同型別指標間的相互轉換,因為所有型別的指標的長度都是一致的(32位系統上都是4位元組),按位元位拷貝後不會損失資料.
C 之四種強制型別轉換
const cast 去除指標或者引用的const屬性 轉化常量指標為非常量指標,並且仍指向原來的物件 轉化常用引用為非常量引用,並且人指向原來的物件 一般用於修改指標 static cast 轉換資料型別,類的上下行轉換。轉換資料型別,由於沒有執行時型別檢擦來保證轉換的安全性,不安全 類的上下行轉...
C 之四種強制型別轉換
c 之四種型別轉換加粗樣式 c 是一種強型別的語言,在實際編碼過程中,經常需要用到型別轉換。在資料型別轉換過程中,c 對c相容,使用顯式或者隱式轉換,顯式是直接用小括號強制轉換,type a type b,隱式是直接 float b 0.5 int a b 這樣隱式截斷這樣隱式的截斷是向 0 取整。...
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...