• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            攀升·Uranus


            Something Different,Something New
            數(shù)據(jù)加載中……

            (轉(zhuǎn)) 總結(jié)C++中的所有強(qiáng)制轉(zhuǎn)換函數(shù)(const_cast,reinterpret_cast,static_cast,dynamic_cast)

            url: http://doserver.net/post/static_cast-const_cast-reinterpret_cast-dynamic_cast.php

            非常抱歉,謝謝郭老師的指正,我沒(méi)有認(rèn)真看這個(gè)文章就轉(zhuǎn)過(guò)來(lái)了,其實(shí)他的錯(cuò)誤太多了,而且還是致命的,對(duì)大家不負(fù)責(zé)任了,請(qǐng)大家諒解!現(xiàn)在是修正版本,基本沒(méi)有錯(cuò)誤了!如果覺(jué)得還有問(wèn)題,請(qǐng)聯(lián)系我,謝謝你的關(guān)注!
            這篇文章其實(shí)并不是不才的原創(chuàng),本來(lái)打算自己寫(xiě)的,但是通過(guò)baidu一下,發(fā)現(xiàn)有兄弟寫(xiě)出來(lái)了,就干脆摘錄下來(lái),供大家參考使用了!
            詳情請(qǐng)看:
            1. 標(biāo)準(zhǔn)c++中主要有四種強(qiáng)制轉(zhuǎn)換類(lèi)型運(yùn)算符:  
            2.   
            3. const_cast,reinterpret_cast,static_cast,dynamic_cast等等。  
            4.   
            5.   
            6.   
            7.   
            8. 1)static_cast<T*>(a)  
            9.   
            10. 將地址a轉(zhuǎn)換成類(lèi)型T,T和a必須是指針、引用、算術(shù)類(lèi)型或枚舉類(lèi)型。  
            11.   
            12. 表達(dá)式static_cast<T*>(a), a的值轉(zhuǎn)換為模板中指定的類(lèi)型T。在運(yùn)行時(shí)轉(zhuǎn)換過(guò)程中,不進(jìn)行類(lèi)型檢查來(lái)確保轉(zhuǎn)換的安全性。  
            13.   
            14.   
            15.   
            16.   
            17. 例子:  
            18.   
            19.   
            20.   
            21.   
            22. class B { ... };  
            23.   
            24. class D : public B { ... };  
            25.   
            26. void f(B* pb, D* pd)  
            27.   
            28. {  
            29.   
            30.    D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指針  
            31.   
            32.   
            33.   
            34.   
            35.    B* pb2 = static_cast<B*>(pd);        // 安全的  
            36.   
            37.    ...  
            38.   
            39. }  
            40.   
            41.   
            42.   
            43.   
            44.   
            45.   
            46.   
            47. class B { ... };  
            48.   
            49. class D : public B { ... };  
            50.   
            51. void f(B* pb, D* pd)  
            52.   
            53. {  
            54.   
            55.    D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指針  
            56.   
            57.   
            58.   
            59.   
            60.    B* pb2 = static_cast<B*>(pd);        // 安全的  
            61.   
            62.    ...  
            63.   
            64. }  
            65.   
            66.   
            67.   
            68.   
            69.   
            70.   
            71.   
            72. class B { ... };  
            73.   
            74. class D : public B { ... };  
            75.   
            76. void f(B* pb, D* pd)  
            77.   
            78. {  
            79.   
            80.    D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指針  
            81.   
            82.   
            83.   
            84.   
            85.    B* pb2 = static_cast<B*>(pd);        // 安全的  
            86.   
            87.    ...  
            88.   
            89. }  
            90.   
            91.   
            92.   
            93.   
            94. 2)dynamic_cast<T*>(a)  
            95.   
            96. 完成類(lèi)層次結(jié)構(gòu)中的提升。T必須是一個(gè)指針、引用或無(wú)類(lèi)型的指針。a必須是決定一個(gè)指針或引用的表達(dá)式。  
            97.   
            98. 表達(dá)式dynamic_cast<T*>(a) 將a值轉(zhuǎn)換為類(lèi)型為T(mén)的對(duì)象指針。如果類(lèi)型T不是a的某個(gè)基類(lèi)型,該操作將返回一個(gè)空指針。  
            99.   
            100.   
            101.   
            102.   
            103. 例子:  
            104.   
            105. class A { ... };  
            106.   
            107. class B { ... };  
            108.   
            109. void f()  
            110.   
            111. {  
            112.   
            113.   A* pa = new A;  
            114.   
            115.   B* pb = new B;  
            116.   
            117.   void* pv = dynamic_cast<A*>(pa);  
            118.   
            119.   // pv 現(xiàn)在指向了一個(gè)類(lèi)型為A的對(duì)象  
            120.   
            121.   ...  
            122.   
            123.   pv = dynamic_cast<B*>(pb);  
            124.   
            125.   // pv 現(xiàn)在指向了一個(gè)類(lèi)型為B的對(duì)象  
            126.   
            127. }  
            128.   
            129.   
            130.   
            131.   
            132. 3)const_cast<T*>(a)  
            133.   
            134. 去掉類(lèi)型中的常量,除了const或不穩(wěn)定的變址數(shù),T和a必須是相同的類(lèi)型。  
            135.   
            136. 表達(dá)式const_cast<T*>(a)被用于從一個(gè)類(lèi)中去除以下這些屬性:const, volatile, 和 __unaligned。  
            137.   
            138.   
            139.   
            140.   
            141. 例子:  
            142.   
            143.   
            144.   
            145.   
            146.   
            147.   
            148.   
            149. class A { ... };  
            150.   
            151. void f()  
            152.   
            153. {  
            154.   
            155.  const A *pa = new A;//const對(duì)象  
            156.   
            157.  A *pb;//非const對(duì)象  
            158.   
            159.   
            160.   
            161.   
            162. //pb = pa; // 這里將出錯(cuò),不能將const對(duì)象指針賦值給非const對(duì)象  
            163.   
            164.  pb = const_cast<A*>(pa); // 現(xiàn)在OK了  
            165.   
            166. ...  
            167.   
            168. }  
            169.   
            170.   
            171.   
            172.   
            173.   
            174.   
            175.   
            176. class A { ... };  
            177.   
            178. void f()  
            179.   
            180. {  
            181.   
            182.  const A *pa = new A;//const對(duì)象  
            183.   
            184.  A *pb;//非const對(duì)象  
            185.   
            186.   
            187.   
            188.   
            189. //pb = pa; // 這里將出錯(cuò),不能將const對(duì)象指針賦值給非const對(duì)象  
            190.   
            191.  pb = const_cast<A*>(pa); // 現(xiàn)在OK了  
            192.   
            193. ...  
            194.   
            195. }  
            196.   
            197.   
            198.   
            199.   
            200.   
            201.   
            202.   
            203. class A { ... };  
            204.   
            205. void f()  
            206.   
            207. {  
            208.   
            209.  const A *pa = new A;//const對(duì)象  
            210.   
            211.  A *pb;//非const對(duì)象  
            212.   
            213.   
            214.   
            215.   
            216. //pb = pa; // 這里將出錯(cuò),不能將const對(duì)象指針賦值給非const對(duì)象  
            217.   
            218.  pb = const_cast<A*>(pa); // 現(xiàn)在OK了  
            219.   
            220. ...  
            221.   
            222. }  
            223.   
            224.   
            225.   
            226.   
            227. 4)reinterpret_cast<T*>(a)  
            228.   
            229. 任何指針都可以轉(zhuǎn)換成其它類(lèi)型的指針,T必須是一個(gè)指針、引用、算術(shù)類(lèi)型、指向函數(shù)的指針或指向一個(gè)類(lèi)成員的指針。  
            230.   
            231. 表達(dá)式reinterpret_cast<T*>(a)能夠用于諸如char* 到 int*,或者One_class* 到 Unrelated_class*等類(lèi)似這樣的轉(zhuǎn)換,因此可能是不安全的。  
            232.   
            233.   
            234.   
            235.   
            236. 例子:  
            237.   
            238. class A { ... };  
            239.   
            240. class B { ... };  
            241.   
            242. void f()  
            243.   
            244. {  
            245.   
            246.   A* pa = new A;  
            247.   
            248.   void* pv = reinterpret_cast<A*>(pa);  
            249.   
            250.   // pv 現(xiàn)在指向了一個(gè)類(lèi)型為B的對(duì)象,這可能是不安全的  
            251.   
            252.   ...  
            253.   


            posted on 2009-06-22 11:24 攀升 閱讀(3797) 評(píng)論(6)  編輯 收藏 引用 所屬分類(lèi): C/C++

            評(píng)論

            # re: (轉(zhuǎn)) 總結(jié)C++中的所有強(qiáng)制轉(zhuǎn)換函數(shù)(const_cast,reinterpret_cast,static_cast,dynamic_cast) [未登錄](méi)  回復(fù)  更多評(píng)論   

            Thinking in C++ 第二卷里面也有詳細(xì)闡述。Uranus同志,把我的網(wǎng)站加入你的圈子啊,哈哈。
            2009-07-06 12:30 | Tim

            # re: (轉(zhuǎn)) 總結(jié)C++中的所有強(qiáng)制轉(zhuǎn)換函數(shù)(const_cast,reinterpret_cast,static_cast,dynamic_cast)   回復(fù)  更多評(píng)論   

            @Tim
            現(xiàn)在公司項(xiàng)目很緊,每天加班
            那天我在給steven說(shuō),如果你在的話,我們就無(wú)敵了,
            無(wú)敵三人組呀,因?yàn)槲覀兡挲g,愛(ài)好和思想接近
            有點(diǎn)懷念那個(gè)時(shí)候的我們了!!!
            2009-07-11 16:00 | 攀升

            # re: (轉(zhuǎn)) 總結(jié)C++中的所有強(qiáng)制轉(zhuǎn)換函數(shù)(const_cast,reinterpret_cast,static_cast,dynamic_cast)   回復(fù)  更多評(píng)論   

            Thinking in C++ 第二卷里面也有詳細(xì)闡述
            我找找看
            2009-07-11 18:41 | 99網(wǎng)上書(shū)城

            # re: (轉(zhuǎn)) 總結(jié)C++中的所有強(qiáng)制轉(zhuǎn)換函數(shù)(const_cast,reinterpret_cast,static_cast,dynamic_cast) [未登錄](méi)  回復(fù)  更多評(píng)論   

            @攀升
            唉,命運(yùn)弄人。
            看著你和Steven我羨慕啊,公司里面有這么強(qiáng)大的板子讓你們搞Andriod。
            想想要是我們?nèi)诠敬龓啄辏约撼鰜?lái)開(kāi)公司肯定沒(méi)問(wèn)題了。
            2009-07-12 16:39 | Tim

            # re: (轉(zhuǎn)) 總結(jié)C++中的所有強(qiáng)制轉(zhuǎn)換函數(shù)(const_cast,reinterpret_cast,static_cast,dynamic_cast)   回復(fù)  更多評(píng)論   

            @Tim
            別這么說(shuō),
            你一定要保證一個(gè)好的心態(tài),好好養(yǎng),
            下次來(lái)上海了一定要喊我,我們一起敘敘。
            2009-07-12 20:52 | 攀升

            # re: (轉(zhuǎn)) 總結(jié)C++中的所有強(qiáng)制轉(zhuǎn)換函數(shù)(const_cast,reinterpret_cast,static_cast,dynamic_cast) [未登錄](méi)  回復(fù)  更多評(píng)論   

            @攀升
            感謝感謝,將來(lái)肯定還來(lái)上海和你們懷舊的。
            我把你博客加到我網(wǎng)站的鏈接上了,鏈接描述我寫(xiě)的”完顏阿骨打怎么也沒(méi)想到他的后代居然搞了IT“,哈哈
            2009-07-15 13:29 | Tim
            色偷偷888欧美精品久久久| 99久久国产宗和精品1上映 | 久久夜色精品国产www| 亚洲欧美国产精品专区久久| 久久精品国产免费观看| 99久久免费国产特黄| 亚洲精品综合久久| 欧美亚洲另类久久综合| 国产欧美久久久精品影院| 久久精品嫩草影院| 久久青青草视频| 国产激情久久久久影院小草 | 亚洲精品国产美女久久久| 国产成人无码精品久久久久免费 | 精品久久久久中文字幕日本| 性做久久久久久久久久久| 精品久久久久久国产| 亚洲精品国精品久久99热一| 久久婷婷色综合一区二区| 久久成人精品视频| 人妻精品久久无码专区精东影业| 久久亚洲国产精品五月天婷| 91久久精品国产免费直播| 亚洲AV无一区二区三区久久| 欧美亚洲国产精品久久| 久久久久亚洲AV成人网人人软件| 91精品国产色综合久久| 欧美黑人激情性久久| 色妞色综合久久夜夜| 99精品国产99久久久久久97| 久久人人爽人人爽人人片av麻烦| 久久久免费观成人影院| 精品一久久香蕉国产线看播放| 天天综合久久久网| 99久久99久久精品国产片| 久久se精品一区二区| 日韩一区二区久久久久久| 国产高清国内精品福利99久久| 曰曰摸天天摸人人看久久久| www亚洲欲色成人久久精品| 国产成人AV综合久久|