大理市住房和城鄉(xiāng)建設(shè)局網(wǎng)站磁力棒
目錄
1. C語言中的類型轉(zhuǎn)換
2. C++強制類型轉(zhuǎn)換
?2.1static_cast
?2.2?reinterpret_cast
?2.3 const_cast
?2.4 dynamic_cast
3. RTTI(了解)
1. C語言中的類型轉(zhuǎn)換
在 C 語言中,如果 賦值運算符左右兩側(cè)類型不同,或者形參與實參類型不匹配,或者返回值類型與
接收返回值類型不一致時,就需要發(fā)生類型轉(zhuǎn)化 , C 語言中總共有兩種形式的類型轉(zhuǎn)換: 隱式類型
轉(zhuǎn)換和顯式類型轉(zhuǎn)換 。
1. 隱式類型轉(zhuǎn)化:編譯器在編譯階段自動進(jìn)行,能轉(zhuǎn)就轉(zhuǎn),不能轉(zhuǎn)就編譯失敗2. 顯式類型轉(zhuǎn)化:需要用戶自己處理
C 風(fēng)格的轉(zhuǎn)換格式很簡單,但是有不少缺點的:????????1. 隱式類型轉(zhuǎn)化有些情況下可能會出問題:比如數(shù)據(jù)精度丟失;????????2. 顯式類型轉(zhuǎn)換將所有情況混合在一起,代碼不夠清晰。
因此 C++ 提出了自己的類型轉(zhuǎn)化風(fēng)格,注意 因為 C++ 要兼容 C 語言,所以 C++ 中還可以使用 C 語言的
轉(zhuǎn)化風(fēng)格 。
2. C++強制類型轉(zhuǎn)換
標(biāo)準(zhǔn) C++ 為了加強類型轉(zhuǎn)換的可視性,引入了四種命名的強制類型轉(zhuǎn)換操作符: static_cast、reinterpret_cast、const_cast、dynamic_cast 。
?2.1static_cast
static_cast 用于非多態(tài)類型的轉(zhuǎn)換(靜態(tài)轉(zhuǎn)換),編譯器隱式執(zhí)行的任何類型轉(zhuǎn)換都可用
static_cast ,但它不能用于兩個不相關(guān)的類型進(jìn)行轉(zhuǎn)換

?2.2?reinterpret_cast
reinterpret_cast 操作符通常為操作數(shù)的位模式提供較低層次的重新解釋,用于將一種類型轉(zhuǎn)換
為另一種不同的類型 。
?2.3 const_cast
const_cast最常用的用途就是刪除變量的const屬性,方便賦值
?這里為什么值沒有發(fā)生變化呢?
這是因為編譯器進(jìn)行了優(yōu)化,編譯器認(rèn)為a有const屬性并不會被改變,所以使用時就直接暫存到寄存器里了,而后面我們?nèi)コ鬰onst屬性對a進(jìn)行修改,只是修改了a在內(nèi)存中的值,寄存器中的值并沒有被改變,這里想實現(xiàn)我們想要的結(jié)果需要一個關(guān)鍵字volatile,它會禁止編譯器優(yōu)化。
?2.4 dynamic_cast
dynamic_cast 用于將一個父類對象的指針 / 引用轉(zhuǎn)換為子類對象的指針或引用 ( 動態(tài)轉(zhuǎn)換 )
向上轉(zhuǎn)型:子類對象指針 / 引用 -> 父類指針 / 引用 ( 不需要轉(zhuǎn)換,賦值兼容規(guī)則 )向下轉(zhuǎn)型:父類對象指針 / 引用 -> 子類指針 / 引用 ( 用 dynamic_cast 轉(zhuǎn)型是安全的 )
這里我們直接進(jìn)行強轉(zhuǎn)是不安全的,如果pa指向的是子類對象,那么轉(zhuǎn)回子類類型是沒問題的,如果pa指向的是父類對象,那么轉(zhuǎn)回子類會多看一部分,是會有越界訪問風(fēng)險的。
注意:
1. dynamic_cast 只能用于父類含有虛函數(shù)的類
2. dynamic_cast 會先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回 0
?
注意
強制類型轉(zhuǎn)換關(guān)閉或掛起了正常的類型檢查 ,每次使用強制類型轉(zhuǎn)換前,應(yīng)該仔細(xì)考慮是否還有其他不同的方法達(dá)到同一目的,如果非強制類型轉(zhuǎn)換不可,則應(yīng)限制強制轉(zhuǎn)換值的作用域,以減少發(fā)生錯誤的機會。強烈建議:避免使用強制類型轉(zhuǎn)換
3. RTTI(了解)
RTTI : Run-time Type identifification 的簡稱,即:運行時類型識別。
C++ 通過以下方式來支持 RTTI :
1. typeid 運算符
2. dynamic_cast 運算符
3. decltype