形式:
cast-name(expression)type 是轉換的目標型別,expression 是要轉換的值。
任何具有明確定義的型別轉換,只要不包含底層const,都可以使用 static_cast。
例如
double a =
3.14
;int b =3;
int a1 =
static_cast
<
int>
(a);
//double轉int
double b1 =
static_cast
<
double
>
(b);
//int轉double
只能改變運算物件的底層const(底層const含義請自行查閱資料)
const_cast中的型別必須是指標、引用或指向物件型別成員的指標。引用的const都是底層const。
例如
/*1.指標*/
const
char a =
'a';
//pc是指向常量的指標,即自己可變,所指內容不可變
const
char
*pc =
&a;//現在可以通過修改 *p 來修改所指內容了,但是仍不能通過 a 和 *pc 進行操作
char
*p =
const_cast
<
char
*>
(pc)
;/*2.引用*/
int temp =2;
//不能改變q的值,引用的const都是底層const
const
int& q = temp;
int& h =
const_cast
<
int&
>
(q);
//可以改變h的值,此時temp的值是12
h =12
;
這種型別轉換實際上是強制編譯器接受 static_cast 通常不允許的型別轉換,它並沒有改變指標的二進位制表示,只是改變了編譯器對原物件的的解釋方式。
例如
int cc =12;
int*p =
&cc;
char
*pc =
static_cast
<
char
*>
(p);
//編譯器會報錯,不允許這樣轉換
char
*pc =
reinterpret_cast
<
char
*>
(p);
//編譯器不報錯
使用 reinterpret_cast 是非常危險的,盡量不要使用它。
此運算子用於將基類的指標或引用安全地轉換成派生類的指標或引用。
適用情況:我們想使用基類物件的指標或引用執行某個派生類操作並且該操作不是虛函式。(只要有可能我們應盡量使用虛函式)
例如:基類:a
派生類(公有繼承a類):b
派生類(公有繼承b類):c
a *p =
new b;
//此時我們想呼叫b的乙個函式,但是該函式不是虛函式,沒辦法用p呼叫,這時讓乙個派生類指標指向這個物件
b *p1 = p;
//錯誤,a*型別的值不能用於初始化 b*型別的實體
b *p1 =
dynamic_cast
>
(p);
//正確
c *p2 =
dynamic_cast
>
(p);
//編譯沒有問題,但執行時會產生錯誤,因為p動態型別是b型別
type(expr); //函式形式的強制型別轉換舊式的強制型別轉換分別具有與 static_cast,const_cast 或 reinterpret_cast 相似的行為。當我們使用它時,若轉換成 static_cast 和 const_cast 也合法,則其行為與對應的命名轉換一致;若不合法,則它執行與 reinterpret_cast 類似的功能。(type)expr; //c語言風格的強制型別轉換
char
*pc =
(char
*)ip;
//ip是指向整數的指標
C 中四種強制型別轉換
c 同時提供了四種新的強制轉型形式 通常稱為新風格的或 c 風格的強制轉型 dynamic cast expression reinterpret cast expression static cast expression const cast const cast 允許新增或刪除指標或引用表示式...
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 四種強制型別轉換
1 概述 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。2 詳解加示例 a const cast 用法 const cast 型別 表示式 用途 刪除con...