只要不包含底層const,都可以使用
/*
static_cast(exp) 將exp的結果轉化為type型別
*/double d = 10;
void *vp = &d;
double *dp = static_cast
(vp);
cout
<< *dp << endl;
如果轉換的型別不符,將會產生ub,且沒有編譯錯誤
只能用於改變(新增或去掉)運算物件的底層const
//新增乙個底層const
int val=10,*p=&val;
const
int *cp = const_cast
int*>(p);
//cp是底層const指標(即使不這麼寫,也會完成隱式轉換)
const_cast的實際用途其實 在於去掉乙個底層const會有這樣一種情況,本來不具有底層const的指標或引用,在傳值的過程中被隱身轉換為底層const,這時可以用const_cast去掉底層const
int val = 10;
const
int *cp = &val; //cp雖然有底層const,但它所指的不是常量
int *pp = const_cast
(cp); //去掉底層const後,可以通過pp改變val的值
/*乙個錯誤的例子*/
const
int cval = 10; //cp所指的cval本就是不許改變的常量
const
int *cp = &cval;
int *pp = const_cast
(cp); //即使去掉了底層cosnt,通過pp對cval改值是ub
reinterpret_cast通常為運算物件的位模式提供較低層次上的重新解釋。舉個例子,假設有如下的轉換:
int *ip;
char *pc = reinterpret_cast
(ip);
我們必須牢記pc所指的真實物件是int而非字元,如果把pc當成乙個普通的字元指標使用就可能在執行時發生錯誤。例如:
string str(po);
可能導致異常的執行時行為。
使用reinterpret_cast是非常危險的,用pc初始化的例子很好地證明了這一點。其中的關鍵問題是型別改變了,但編譯器沒有給出任何警告或者錯誤的提示資訊。當我們用乙個int的位址初始化pc時,由於顯式地聲稱這種轉換合法,所以編譯器不會發出任何警告或錯誤資訊。接下來再使用pc時就會認定它的值是char*型別,編譯器沒法知道它實際存放的是指向int的指標。
reinterpret_cast有何作用?
只用於物件的指標和引用.當用於多型型別時,它允許任意的隱式型別轉換以及相 反過程.
不過,與static_cast不同,在後一種情況裡(注:即隱式轉換的相反過程),dynamic_cast 會檢查操作是否有效. 也就是說, 它會檢查轉換是否會返回乙個被請求的有效的完整物件。檢測在執行時進行. 如果被轉換的指標不是乙個被請求的有效完整的物件指標,返回值為null. 對於引用 型別,會丟擲bad_cast異常 .
type(expr) //函式形式的強制型別轉換
(type)expr //c語言風格的強制型別轉換
舊式的強制型別轉換從表現形式上來說不那麼清晰,容易看漏,而且一旦轉換出現問題,追蹤起來也很困難。
C 中型別強制轉換
c 中有4種強制轉換 const cast,static cast,dynamic cast,reinterpret cast,以下將分別介紹 1.const cast 形式const cast expression 用來修改型別的const或volatile屬性,除了const或volatile修...
C 中的強制型別轉換
關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...
C 中的型別強制轉換
c 同時提供了四種新的強制轉型形式 通常稱為新風格的或 c 風格的強制轉型 const cast expression dynamic cast expression reinterpret cast expression static cast expression 每一種適用於特定的目的 dyn...