• <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 攀升 閱讀(3804) 評論(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
            精品久久久久久无码中文字幕| 久久人爽人人爽人人片AV| 久久国产免费观看精品| 99久久99久久精品国产片| 久久综合久久鬼色| 99久久99久久久精品齐齐| 国产巨作麻豆欧美亚洲综合久久 | 伊人久久精品无码av一区| 久久精品水蜜桃av综合天堂| 久久成人影院精品777| 欧美久久亚洲精品| 国产精品久久精品| 77777亚洲午夜久久多人| 国产精品成人精品久久久| 精品熟女少妇AV免费久久| 久久久久亚洲av毛片大| 国产精品青草久久久久婷婷| 一本一本久久a久久精品综合麻豆| 精品久久777| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 国产成人久久久精品二区三区 | 亚洲精品第一综合99久久 | 国产精品无码久久久久| 久久精品国产亚洲av麻豆色欲 | 一级做a爰片久久毛片16| 久久久久AV综合网成人| 国产A三级久久精品| 久久这里的只有是精品23| 国产免费福利体检区久久| 国内精品久久久久| 97久久精品午夜一区二区| 国产精品久久久久jk制服| 性欧美丰满熟妇XXXX性久久久 | 中文字幕乱码久久午夜| 久久综合亚洲色一区二区三区| 久久久久久久久久免免费精品| 免费精品99久久国产综合精品| 精品午夜久久福利大片| 欧美亚洲国产精品久久蜜芽| 精品国产一区二区三区久久久狼 | 色综合合久久天天综合绕视看 |