so true

          心懷未來(lái),開(kāi)創(chuàng)未來(lái)!
          隨筆 - 160, 文章 - 0, 評(píng)論 - 40, 引用 - 0
          數(shù)據(jù)加載中……

          有關(guān)static_cast,const_cast,dynamic_cast和reinterpret_cast的深入理解

          static_cast:干雜活的,那三個(gè)都有各自的專有用途,那三個(gè)不做的都由這個(gè)轉(zhuǎn)型符來(lái)做,只要它能做的,用C語(yǔ)法的強(qiáng)制類型轉(zhuǎn)換運(yùn)算符也一定能夠完成;但話又說(shuō)回來(lái)了,C強(qiáng)制類型轉(zhuǎn)換能做的,它可不一定都能做,比如去除const性。
          此外在這里聲明一點(diǎn),一般人都不會(huì)清楚都不會(huì)注意到的一點(diǎn),就是四個(gè)之中只有它可以用于非指針?lè)且妙愋偷霓D(zhuǎn)換,其他三個(gè)運(yùn)算符基本上都是專門(mén)和指針或者引用打交道的。
          const_static:去除“指針”或“引用”的const、volatile、__unaligned性。很多人都以為用這個(gè)運(yùn)算符就可以讓const這么“固若金湯”的東西“形同虛設(shè)”,實(shí)則不然,本質(zhì)上它能做的也就僅僅是為你剝?nèi)ヒ粚犹摷俚耐鈿ぃ绻?#8220;被指向”或“被引用”的東西本身就是const的,那任憑你費(fèi)多大力氣都是徒勞的。一般它都是用在這樣的一套邏輯中:
          int a=34;const int * pcint=&a;int *pint=const_cast<int*>(pcint);*pint=0;這樣就修改了本來(lái)是const的指針《該指針要求不能修改它指向的東東》,這里如果改為const int a=34;那么雖然編譯依然能通過(guò),運(yùn)行依然OK,但是實(shí)際上當(dāng)你用*pint來(lái)修改時(shí),你會(huì)得到修改后的值為:a依然為34;而*pint確實(shí)為0了,但有趣的是此時(shí)pint=&a依然成立,雖然pint指向a,但是取出它的值卻不等于a了。至此,希望大家今后不要再誤用const_cast了。
          dynamic_cast:用精煉的語(yǔ)言概括,就是專門(mén)用于面向?qū)ο笾械膁own cast的。但是有三點(diǎn)是前提:第一,必須用于類和子類之間的轉(zhuǎn)換;第二,必須用于指針或引用類型的轉(zhuǎn)換;第三,基類必須有虛函數(shù)。
          reinterpret_cast:用于對(duì)指針的重新包裝,也就是指針類別之間的轉(zhuǎn)化,除此之外,還可以用于指針類型和unsigned int類型之間的轉(zhuǎn)化。

          posted on 2008-07-28 20:20 so true 閱讀(836) 評(píng)論(0)  編輯  收藏 所屬分類: C&C++

          主站蜘蛛池模板: 册亨县| 大安市| 郧西县| 化德县| 嘉义县| 新乡县| 汉中市| 嘉义市| 澜沧| 三河市| 北宁市| 河曲县| 镇江市| 泽州县| 四川省| 登封市| 山西省| 革吉县| 津市市| 车致| 中江县| 宁安市| 广灵县| 会理县| 平顺县| 栾川县| 米林县| 九江县| 昌宁县| 拜泉县| 上思县| 奇台县| 左权县| 正蓝旗| 丽水市| 荣成市| 邵阳县| 松滋市| 东台市| 本溪市| 吕梁市|