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

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