類型轉(zhuǎn)換在。我們編寫程序時(shí)是不可避免的,比如我們分配一個(gè)內(nèi)存區(qū)域,它將要存儲(chǔ)的對(duì)象類型對(duì)編譯器是不可知的。最典型的例子就是void*指針,調(diào)用malloc時(shí)會(huì)返回一個(gè)void*,編譯器并不知道void*指向的對(duì)象類型。
由此可見,類型轉(zhuǎn)換時(shí)不可以或缺的!下面我們介紹C++提供的4種顯示類型轉(zhuǎn)換,及繼承自C的類型轉(zhuǎn)換方式(Type)expression。本文的主要內(nèi)容如下:
寫在前面
static_cast(exp)顯示轉(zhuǎn)換
reinterpret_cast(exp)顯式轉(zhuǎn)換
dynamic_cast(exp)顯示轉(zhuǎn)換
const_cast(exp)顯示轉(zhuǎn)換
總結(jié)
1、寫在前面
顯示類型轉(zhuǎn)換有時(shí)是必需的,如前面提到的void *指針。我們必須將malloc返回的void*指針顯示轉(zhuǎn)換為特定的類型,eg.:int * p=static_cast(malloc(100));還有如果我們想通過一個(gè)給定的十六進(jìn)制數(shù)訪問內(nèi)存。這大大方便了我們編程,但同時(shí)也帶來了風(fēng)險(xiǎn),用得不好將成為很多錯(cuò)誤的根源!如你通過一個(gè)十六進(jìn)數(shù)去訪問內(nèi)存可能會(huì)導(dǎo)致程序崩潰;如你內(nèi)存轉(zhuǎn)換時(shí)可能會(huì)截?cái)嘣袛?shù)據(jù)…… www.liuhebao.com
因此我們?cè)陬愋娃D(zhuǎn)換時(shí)必須得小心。
2、static_cast(exp)顯示轉(zhuǎn)換
static_cast類型轉(zhuǎn)換用于相關(guān)類型之間的轉(zhuǎn)換,諸如:在同一個(gè)類的繼承層次關(guān)系中,向上或向下轉(zhuǎn)換;枚舉類型與整數(shù)類型之間的轉(zhuǎn)換;浮點(diǎn)類型與指數(shù)類型之間的轉(zhuǎn)換。
在這4中類型轉(zhuǎn)換中,static_cast是最接近C-style的了。
3、reinterpret_cast(exp)顯式轉(zhuǎn)換
字面理解即re-interpret,重新解析(釋)的意思。故名思意,它主要用于不相關(guān)類型之間的轉(zhuǎn)換,好一個(gè)英文單詞在不同的上下文中,詞性和詞義可能完全不同。它為不同類型之間轉(zhuǎn)換帶來的便利,但是也伴隨著風(fēng)險(xiǎn)的,如將一個(gè)十六進(jìn)制整數(shù)轉(zhuǎn)換為內(nèi)存地址(由int-->指針類型,這兩種類型完全不關(guān)聯(lián))。既然是用于不相關(guān)類型之間的轉(zhuǎn)換,也就意味著編譯器不會(huì)做太多的確認(rèn)和承諾。 www.yzyedu.com
reinterpret_cast方式還有一個(gè)特點(diǎn)就是:目標(biāo)和原始值之間至少有相同的位數(shù),我們可以將轉(zhuǎn)換之后的值再轉(zhuǎn)換回去,而不像其它3種類型可能會(huì)導(dǎo)致精度丟失。
4、dynamic_cast(exp)顯示轉(zhuǎn)換
一種運(yùn)行時(shí)(run-time)檢測的類型轉(zhuǎn)換,因此轉(zhuǎn)換可能需要較大的運(yùn)行時(shí)代價(jià),這種類型也是用C-style是無法實(shí)現(xiàn)的。主要用于執(zhí)行類型向下轉(zhuǎn)換和繼承之間的轉(zhuǎn)換。
5、const_cast(exp)顯示轉(zhuǎn)換
用于消除變量的const限定,轉(zhuǎn)換之后的變量就不再具有“const”了,如果是一個(gè)const指針的話,轉(zhuǎn)換之后可以改變指向而指向其它對(duì)象。 www.yzjxsp.com
6、總結(jié)
用C-style的(Type)expression的格式轉(zhuǎn)換,可以用我們上面介紹的4種方式來替代。雖然中可以使用C-style的形式仍可用,但更加建議使用上面的4中類型。因?yàn)镃-style的類型轉(zhuǎn)換更加危險(xiǎn):
在一個(gè)大型程序中更難定位和識(shí)別
哪種類型轉(zhuǎn)換并不明顯
而用上面的四種方式可以更加準(zhǔn)確地定位哪種類型轉(zhuǎn)換發(fā)生了錯(cuò)誤。