• <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 攀升 閱讀(3798) 評論(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
            日本久久久精品中文字幕| 91精品婷婷国产综合久久 | 国产精品久久网| 99久久99这里只有免费费精品| 国产综合久久久久| 久久久无码精品午夜| 久久久亚洲欧洲日产国码是AV| 久久精品国产精品亚洲毛片| AV无码久久久久不卡网站下载| 热久久国产精品| 久久久久久久波多野结衣高潮| 精品国产一区二区三区久久久狼| 国产精品热久久无码av| 午夜精品久久久久久中宇| 国产99久久久国产精品~~牛| 色狠狠久久综合网| 国产日韩欧美久久| 久久中文骚妇内射| 亚洲国产精品一区二区三区久久| 久久综合久久自在自线精品自| 久久天天躁狠狠躁夜夜av浪潮| 久久久久亚洲av无码专区导航| 综合久久一区二区三区 | 日韩精品久久久久久| 亚洲人成无码久久电影网站| 久久婷婷综合中文字幕| 色欲av伊人久久大香线蕉影院| 精品人妻伦九区久久AAA片69| 久久无码人妻一区二区三区 | 国产精品视频久久| 亚洲国产精品无码久久久秋霞2| 精品欧美一区二区三区久久久| 好久久免费视频高清| 久久精品aⅴ无码中文字字幕重口| 久久无码AV一区二区三区| 久久综合伊人77777麻豆| 久久国产精品一区| 久久国产福利免费| 久久精品三级视频| 亚洲伊人久久综合影院| 久久婷婷五月综合成人D啪 |