關鍵字
說明static_cast
用於良性轉換,一般不會導致意外發生,風險很低。
const_cast
用於 const 與非 const、volatile 與非 volatile 之間的轉換。
reinterpret_cast
高度危險的轉換,這種轉換僅僅是對二進位制位重新解釋,是static_cast的互補
dynamic_cast
借助 rtti,用於型別安全的下行轉換。上行轉換與static_cast一樣。
該運算子可以進行良性型別轉換,轉換風險較低。它主要有如下幾種用途:
①用於基類(父類)和派生類(子類)之間指標或引用的轉換。
進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;
進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。
②用於基本資料型別之間的轉換,例如 short 轉 int、int 轉 double、int轉換成char等,這種轉換的安全性也要開發人員來保證。
③把空指標轉換成目標型別的空指標,例如 void * 轉 int *。
④把任何型別的表示式轉換成void型別, 例如 int 轉 void。
⑤無法將const、volatile、__unaligned屬性去掉
static_cast 沒有型別檢查來保證轉換的安全性,不能用於無關型別之間的轉換,例如:
static_cast 是在編譯期間轉換,轉換失敗的話會丟擲乙個編譯錯誤。
int m = 100;long n = static_cast(m); //
寬轉換,沒有資訊丟失
char ch = static_cast(m); //
窄轉換,可能會丟失資訊
int *p1 = static_cast(malloc(10 * sizeof(int))); //
將void指標轉換為具體型別指標
void *p2 = static_cast(p1); //
將具體型別指標,轉換為void指標
//下面的用法是錯誤的
float *p3 = static_cast(p1); //
不能在兩個具體型別的指標之間進行轉換
p3 = static_cast(0x2df9); //
不能將整數轉換為指標型別
const_cast 就是用來將 const/volatile 型別轉換為非 const/volatile 型別。
constint n = 100
;
int *p = const_cast(&n);
*p = 234
; cout
<< "
n =
" << n << endl; //
100 cout << "
*p =
" << *p << endl; //
234
&n用來獲取 n 的位址,它的型別為const int *,必須使用 const_cast 轉換為int *型別後才能賦值給 p。由於 p 指向了 n,並且 n 占用的是棧記憶體,有寫入許可權,所以可以通過 p 修改 n 的值。
由於 c++ 對常量的處理更像是編譯時期的#define,是乙個值替換的過程,**中所有使用 n 的地方在編譯期間就被替換成了 100。換句話說,第 4 行**被修改成了下面的形式:
cout << "n =
"<< 100
<< endl; //
100
reinterpret_cast 僅僅是對二進位制位重新解釋,不會借助已有的轉換規則對資料進行調整。
reinterpret_cast 可以認為是 static_cast 的一種補充,一些 static_cast 不能完成的轉換,就可以用 reinterpret_cast 來完成,例如兩個具體型別指標之間的轉換、int 和指標之間的轉換。
//將 char* 轉換為 float*
char str = "
";float *p1 = reinterpret_cast(str);
cout
<< *p1 << endl; //
3.0262e+29
//將 int 轉換為 int*
int *p = reinterpret_cast(100
); cout
<< *p << endl; //
100
dynamic_cast 用於在類的繼承層次之間進行型別轉換,它既允許上行轉換,也允許下行轉換。
dynamic_cast 與 static_cast 是相對的。dynamic_cast 會在程式執行期間借助 rtti 進行型別轉換,這就要求基類必須包含虛函式;static_cast 在編譯期間完成型別轉換,能夠更加及時地發現錯誤。
//下行轉換
class
a private
:
intm_a;
};class b : public
a private
:
intm_b;
};class c : public
b private
:
intm_c;
};class d : public
c private
:
intm_d;
};int
main()
c 型別轉換運算子
c 中有4個型別轉換運算子,使裝換過程更規範 dynamic cast type name expression 如果轉型失敗則返回0,即空指標。該運算子的用途是,使得能夠在類層次結構中進行向上轉換 由於 is a關係,這樣的型別轉換時安全的 而不允許其他轉換。二 const cast const ...
C 型別轉換運算子
隱式轉換,是針對不同型別之間的賦值和運算,函式呼叫傳遞引數 這些的轉換都是由編譯器自動完成 char ch int i ch 顯式轉換 由程式設計師在變數前面新增型轉換 char pc char pb void ps void pa 通過上述的兩種方式,c語言大部分的型別轉換都可以順利進行,c 繼承...
C 型別轉換運算子
用於 指向派生類物件的 基類指標轉換成派生類指標。如果轉換失敗,則返回0,即空指標。通過判斷轉換是否成功,來決定是否用派生類裡的函式 基類中可能沒有那個函式 class a class b public a class c public b a a new a a b new b a c new c...