• <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
            數據加載中……

            (轉) 總結C++中的所有強制轉換函數(const_cast,reinterpret_cast,static_cast,dynamic_cast)

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

            非常抱歉,謝謝郭老師的指正,我沒有認真看這個文章就轉過來了,其實他的錯誤太多了,而且還是致命的,對大家不負責任了,請大家諒解!現在是修正版本,基本沒有錯誤了!如果覺得還有問題,請聯系我,謝謝你的關注!
            這篇文章其實并不是不才的原創,本來打算自己寫的,但是通過baidu一下,發現有兄弟寫出來了,就干脆摘錄下來,供大家參考使用了!
            詳情請看:
            1. 標準c++中主要有四種強制轉換類型運算符:  
            2.   
            3. const_cast,reinterpret_cast,static_cast,dynamic_cast等等。  
            4.   
            5.   
            6.   
            7.   
            8. 1)static_cast<T*>(a)  
            9.   
            10. 將地址a轉換成類型T,T和a必須是指針、引用、算術類型或枚舉類型。  
            11.   
            12. 表達式static_cast<T*>(a), a的值轉換為模板中指定的類型T。在運行時轉換過程中,不進行類型檢查來確保轉換的安全性。  
            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. 完成類層次結構中的提升。T必須是一個指針、引用或無類型的指針。a必須是決定一個指針或引用的表達式。  
            97.   
            98. 表達式dynamic_cast<T*>(a) 將a值轉換為類型為T的對象指針。如果類型T不是a的某個基類型,該操作將返回一個空指針。  
            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 現在指向了一個類型為A的對象  
            120.   
            121.   ...  
            122.   
            123.   pv = dynamic_cast<B*>(pb);  
            124.   
            125.   // pv 現在指向了一個類型為B的對象  
            126.   
            127. }  
            128.   
            129.   
            130.   
            131.   
            132. 3)const_cast<T*>(a)  
            133.   
            134. 去掉類型中的常量,除了const或不穩定的變址數,T和a必須是相同的類型。  
            135.   
            136. 表達式const_cast<T*>(a)被用于從一個類中去除以下這些屬性: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對象  
            156.   
            157.  A *pb;//非const對象  
            158.   
            159.   
            160.   
            161.   
            162. //pb = pa; // 這里將出錯,不能將const對象指針賦值給非const對象  
            163.   
            164.  pb = const_cast<A*>(pa); // 現在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對象  
            183.   
            184.  A *pb;//非const對象  
            185.   
            186.   
            187.   
            188.   
            189. //pb = pa; // 這里將出錯,不能將const對象指針賦值給非const對象  
            190.   
            191.  pb = const_cast<A*>(pa); // 現在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對象  
            210.   
            211.  A *pb;//非const對象  
            212.   
            213.   
            214.   
            215.   
            216. //pb = pa; // 這里將出錯,不能將const對象指針賦值給非const對象  
            217.   
            218.  pb = const_cast<A*>(pa); // 現在OK了  
            219.   
            220. ...  
            221.   
            222. }  
            223.   
            224.   
            225.   
            226.   
            227. 4)reinterpret_cast<T*>(a)  
            228.   
            229. 任何指針都可以轉換成其它類型的指針,T必須是一個指針、引用、算術類型、指向函數的指針或指向一個類成員的指針。  
            230.   
            231. 表達式reinterpret_cast<T*>(a)能夠用于諸如char* 到 int*,或者One_class* 到 Unrelated_class*等類似這樣的轉換,因此可能是不安全的。  
            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 現在指向了一個類型為B的對象,這可能是不安全的  
            251.   
            252.   ...  
            253.   


            posted on 2009-06-22 11:24 攀升 閱讀(3812) 評論(6)  編輯 收藏 引用 所屬分類: C/C++

            評論

            # re: (轉) 總結C++中的所有強制轉換函數(const_cast,reinterpret_cast,static_cast,dynamic_cast) [未登錄]  回復  更多評論   

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

            # re: (轉) 總結C++中的所有強制轉換函數(const_cast,reinterpret_cast,static_cast,dynamic_cast)   回復  更多評論   

            @Tim
            現在公司項目很緊,每天加班
            那天我在給steven說,如果你在的話,我們就無敵了,
            無敵三人組呀,因為我們年齡,愛好和思想接近
            有點懷念那個時候的我們了!!!
            2009-07-11 16:00 | 攀升

            # re: (轉) 總結C++中的所有強制轉換函數(const_cast,reinterpret_cast,static_cast,dynamic_cast)   回復  更多評論   

            Thinking in C++ 第二卷里面也有詳細闡述
            我找找看
            2009-07-11 18:41 | 99網上書城

            # re: (轉) 總結C++中的所有強制轉換函數(const_cast,reinterpret_cast,static_cast,dynamic_cast) [未登錄]  回復  更多評論   

            @攀升
            唉,命運弄人。
            看著你和Steven我羨慕啊,公司里面有這么強大的板子讓你們搞Andriod。
            想想要是我們三在公司待幾年,自己出來開公司肯定沒問題了。
            2009-07-12 16:39 | Tim

            # re: (轉) 總結C++中的所有強制轉換函數(const_cast,reinterpret_cast,static_cast,dynamic_cast)   回復  更多評論   

            @Tim
            別這么說,
            你一定要保證一個好的心態,好好養,
            下次來上海了一定要喊我,我們一起敘敘。
            2009-07-12 20:52 | 攀升

            # re: (轉) 總結C++中的所有強制轉換函數(const_cast,reinterpret_cast,static_cast,dynamic_cast) [未登錄]  回復  更多評論   

            @攀升
            感謝感謝,將來肯定還來上海和你們懷舊的。
            我把你博客加到我網站的鏈接上了,鏈接描述我寫的”完顏阿骨打怎么也沒想到他的后代居然搞了IT“,哈哈
            2009-07-15 13:29 | Tim
            久久精品卫校国产小美女| 成人资源影音先锋久久资源网| 97久久久精品综合88久久| 久久国产色av免费看| 区久久AAA片69亚洲| 久久亚洲欧洲国产综合| 欧美午夜A∨大片久久 | 色诱久久av| 热久久国产欧美一区二区精品| 国产香蕉97碰碰久久人人| 久久久久国产一级毛片高清板| 久久精品中文字幕第23页| 国产免费久久精品99re丫y| 国内精品久久久久影院薰衣草| 人妻精品久久无码区| 久久777国产线看观看精品| 久久久网中文字幕| 日产精品久久久久久久| 精品久久久久久综合日本| 久久久精品久久久久久| 国产欧美久久久精品影院| 久久人人爽人人爽人人AV | 99久久国产精品免费一区二区 | 久久99热只有频精品8| 97久久综合精品久久久综合| 国产精品99久久久久久www| 久久久亚洲裙底偷窥综合| 久久国产高潮流白浆免费观看| 成人精品一区二区久久久| 国产69精品久久久久观看软件| 久久99国内精品自在现线| 国产香蕉97碰碰久久人人| 无码专区久久综合久中文字幕 | 久久精品国产亚洲AV不卡| 久久精品国产亚洲av麻豆图片| 久久er国产精品免费观看2| 一极黄色视频久久网站| 人人狠狠综合久久亚洲婷婷| 99久久做夜夜爱天天做精品| 国产精品成人无码久久久久久| 久久亚洲AV无码精品色午夜麻豆 |