c++中有4種強制轉換:const_cast,static_cast, dynamic_cast, reinterpret_cast,以下將分別介紹:
1. const_cast:
形式const_cast(expression),用來修改型別的const或volatile屬性,除了const或volatile修飾以外,type與expression型別一樣;
它主要用於移除const:
將(const)pointer-to-const轉化為(const)pointer-to-nonconst;
將referece-to-const轉化為reference-to-nonconst;
不能將const物件轉換為nonconst物件,
如不可以這樣:const i=1; int j=const_cast(i);
但可以直接:int j=i;
2. static_cast:
形式static_cast < type> ( expression ),將expression轉換為type型別。
沒有執行時型別檢查來保證轉換的安全性。
它主要用於:
基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum;注意static_cast(intvar)與static(intvar)之間的區別:前者建立了乙個臨時變數,而後者建立了乙個引用,該引用繫結到當前物件intvar上;
將non-const轉換為const物件;有時候需要將nonconst明確轉換為const物件,以呼叫因const而過載的函式或成員函式,例如在非const成員函式中呼叫const成員函式,需要:static(*this).constfunction(…);
類層次結構中基類和子類之間物件、指標或引用的轉換,注意 進行下行轉換(把基類物件、指標或引用轉換成子類表示)時,由於沒有動態型別檢查,所以是不安全的。
把任意型別的空指標轉換為另一種型別的空指標;
把任何型別的指標轉換為void型別或反過來。
3. dynamic_cast:
形式dynamic_cast < type > ( expression ),將expression轉換為type型別。
dynamic_cast在執行時會動態檢查,比static_cast更安全。
用於:繼承關係中的基類和派生類之間的指標或引用的變換,特別是能用dynamic_cast把指向基類的指標或引用轉換成指向其派生類或其兄弟類的指標或引用;沒有繼承關係,指標和引用也可以被轉換,只要指標或引用指向或引用的物件具有至少乙個虛函式,如:可以把任何乙個指向具有虛函式物件的指標轉換為void* 或const void*或volatile void*,結果是生成的指標將指向「原指標指向物件記憶體」的開始處。
如果expression實際動態指向或引用的物件型別確實是type,則成功,否則失敗;失敗的轉換將返回空指標(當對指標進行型別轉換時)或者丟擲異常(當對引用進行型別轉換時)。
4. reinterpret_cast:
形式reinpreter_cast (expression),將expression轉換為type形式。主要是用於將乙個型別的指標轉換為另乙個型別的指標,如函式指標。
編譯時靜態檢查,而且一般不具有移植性,應慎用。
用於:將一種型別的指標或者引用轉換為另一種型別的指標或引用;將指標轉換為整型,或將整型轉換為指標(先把乙個指標轉換成乙個整數,在把該整數轉換成原型別的指標,還可以得到原先的指標值)。
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...
C 中的強制型別轉換
這幾天修改系統的bug,每天都會遇到一些很 有趣 的事情,寫出來和大家分享。該系統的壽命也不算短,有 五 六年了。開發人員換了多代,問題層出不窮。沒有自動化測試來保障的系統就是這樣,改正乙個bug可能引入更多其它的 bug,錯誤率一直具高不下 開發人員也變的 畏手畏腳 的,不敢對系統進行大膽地重構,...