• <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>
            Impossible is nothing  
              愛(ài)過(guò)知情重醉過(guò)知酒濃   花開(kāi)花謝終是空   緣份不停留像春風(fēng)來(lái)又走   女人如花花似夢(mèng)
            公告
            日歷
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345
            統(tǒng)計(jì)
            • 隨筆 - 8
            • 文章 - 91
            • 評(píng)論 - 16
            • 引用 - 0

            導(dǎo)航

            常用鏈接

            留言簿(4)

            隨筆分類(4)

            隨筆檔案(8)

            文章分類(77)

            文章檔案(91)

            相冊(cè)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

             
            C++風(fēng)格的類型轉(zhuǎn)換的用法
            這是More?Effecitve?C++里的第二條對(duì)類型轉(zhuǎn)換講的很好,也很基礎(chǔ)好懂。
            Item?M2:盡量使用C++風(fēng)格的類型轉(zhuǎn)換
            仔細(xì)想想地位卑賤的類型轉(zhuǎn)換功能(cast),其在程序設(shè)計(jì)中的地位就象goto語(yǔ)句一樣令人鄙視。但是它還不是無(wú)法令人忍受,因?yàn)楫?dāng)在某些緊要的關(guān)頭,類型轉(zhuǎn)換還是必需的,這時(shí)它是一個(gè)必需品。
            不過(guò)C風(fēng)格的類型轉(zhuǎn)換并不代表所有的類型轉(zhuǎn)換功能。
            一 來(lái)它們過(guò)于粗魯,能允許你在任何類型之間進(jìn)行轉(zhuǎn)換。不過(guò)如果要進(jìn)行更精確的類型轉(zhuǎn)換,這會(huì)是一個(gè)優(yōu)點(diǎn)。在這些類型轉(zhuǎn)換中存在著巨大的不同,例如把一個(gè)指向 ?const對(duì)象的指針(pointer-to-const-object)轉(zhuǎn)換成指向非const對(duì)象的指針(pointer-to-non -const?-object)(即一個(gè)僅僅去除const的類型轉(zhuǎn)換),把一個(gè)指向基類的指針轉(zhuǎn)換成指向子類的指針(即完全改變對(duì)象類型)。 傳統(tǒng)的C風(fēng)格的類型轉(zhuǎn)換不對(duì)上述兩種轉(zhuǎn)換進(jìn)行區(qū)分。(這一點(diǎn)也不令人驚訝,因?yàn)镃風(fēng)格的類型轉(zhuǎn)換是為C語(yǔ)言設(shè)計(jì)的,而不是為C++語(yǔ)言設(shè)計(jì)的)。
            二 來(lái)C風(fēng)格的類型轉(zhuǎn)換在程序語(yǔ)句中難以識(shí)別。在語(yǔ)法上,類型轉(zhuǎn)換由圓括號(hào)和標(biāo)識(shí)符組成,而這些可以用在C++中的任何地方。這使得回答象這樣一個(gè)最基本的有 關(guān)類型轉(zhuǎn)換的問(wèn)題變得很困難:“在這個(gè)程序中是否使用了類型轉(zhuǎn)換?”。這是因?yàn)槿斯ら喿x很可能忽略了類型轉(zhuǎn)換的語(yǔ)句,而利用象grep的工具程序也不能從 語(yǔ)句構(gòu)成上區(qū)分出它們來(lái)。
            C++通過(guò)引進(jìn)四個(gè)新的類型轉(zhuǎn)換操作符克服了C風(fēng)格類型轉(zhuǎn)換的缺點(diǎn),這四個(gè)操作符是,? static_cast,?const_cast,?dynamic_cast,?和reinterpret_cast。 在大多數(shù)情況下,對(duì)于這些操作符你只需要知道原來(lái)你習(xí)慣于這樣寫(xiě),
            (type)?expression
            而現(xiàn)在你總應(yīng)該這樣寫(xiě):
            static_cast
            < type > (expression)
            例如,假設(shè)你想把一個(gè)int轉(zhuǎn)換成double,以便讓包含int類型變量的表達(dá)式產(chǎn)生出浮點(diǎn)數(shù)值的結(jié)果。如果用C風(fēng)格的類型轉(zhuǎn)換,你能這樣寫(xiě):
            int?firstNumber,?secondNumber;

            double?result?=?((double)firstNumber)/secondNumber;
            如果用上述新的類型轉(zhuǎn)換方法,你應(yīng)該這樣寫(xiě):
            double?result?=?static_cast
            < double > (firstNumber)/secondNumber;
            這樣的類型轉(zhuǎn)換不論是對(duì)人工還是對(duì)程序都很容易識(shí)別。
            static_cast? 在功能上基本上與C風(fēng)格的類型轉(zhuǎn)換一樣強(qiáng)大,含義也一樣。它也有功能上限制。例如,你不能用static_cast象用C風(fēng)格的類型轉(zhuǎn)換一樣把 ?struct轉(zhuǎn)換成int類型或者把double類型轉(zhuǎn)換成指針類型,另外,static_cast不能從表達(dá)式中去除const屬性,因?yàn)? 另一個(gè)新的類型轉(zhuǎn)換操作符const_cast有這樣的功能。
            其它新的C++類型轉(zhuǎn)換操作符被用在需要更多限制的地方。const_cast用于 類型轉(zhuǎn)換掉表達(dá)式的const或volatileness屬性。通過(guò)使用const_cast,你向人們和編譯器強(qiáng)調(diào)你通過(guò)類型轉(zhuǎn)換想做的只是改變一些東 西的?constness或者volatileness屬性。這個(gè)含義被編譯器所約束。如果你試圖使用const_cast來(lái)完成修改 constness?或者volatileness屬性之外的事情,你的類型轉(zhuǎn)換將被拒絕。下面是一些例子:
            class?Widget?{??};
            class?SpecialWidget:?public?Widget?{??};
            void?update(SpecialWidget?*psw);
            SpecialWidget?sw;?//?sw?是一個(gè)非const?對(duì)象。
            const?SpecialWidget&?csw?=?sw;?//?csw?是sw的一個(gè)引用
            //?它是一個(gè)const?對(duì)象
            update(
            &csw );?//?錯(cuò)誤!不能傳遞一個(gè)const?SpecialWidget*?變量
            //?給一個(gè)處理SpecialWidget*類型變量的函數(shù)
            update(const_cast
            < SpecialWidget * > ( &csw ));
            //?正確,csw的const被顯示地轉(zhuǎn)換掉(
            //?csw和sw兩個(gè)變量值在update
            //函數(shù)中能被更新)
            update((SpecialWidget*)
            &csw );
            //?同上,但用了一個(gè)更難識(shí)別
            //的C風(fēng)格的類型轉(zhuǎn)換
            Widget?*pw?=?new?SpecialWidget;
            update(pw);?//?錯(cuò)誤!pw的類型是Widget*,但是
            //?update函數(shù)處理的是SpecialWidget*類型
            update(const_cast
            < SpecialWidget * > (pw));
            //?錯(cuò)誤!const_cast僅能被用在影響
            //?constness?or?volatileness的地方上。,
            //?不能用在向繼承子類進(jìn)行類型轉(zhuǎn)換。
            到目前為止,const_cast最普通的用途就是轉(zhuǎn)換掉對(duì)象的const屬性。
            第 二種特殊的類型轉(zhuǎn)換符是dynamic_cast,它被用于安全地沿著類的繼承關(guān)系向下進(jìn)行類型轉(zhuǎn)換。這就是說(shuō),你能用dynamic_cast把指向基 類的指針或引用轉(zhuǎn)換成指向其派生類或其兄弟類的指針或引用,而且你能知道轉(zhuǎn)換是否成功。失敗的轉(zhuǎn)換將返回空指針(當(dāng)對(duì)指針進(jìn)行類型轉(zhuǎn)換時(shí))或者拋出異常 (當(dāng)對(duì)引用進(jìn)行類型轉(zhuǎn)換時(shí)):
            Widget?*pw;

            update(dynamic_cast
            < SpecialWidget * > (pw));
            //?正確,傳遞給update函數(shù)一個(gè)指針
            //?是指向變量類型為SpecialWidget的pw的指針
            //?如果pw確實(shí)指向一個(gè)對(duì)象,
            //?否則傳遞過(guò)去的將使空指針。
            void?updateViaRef(SpecialWidget&?rsw);
            updateViaRef(dynamic_cast
            < SpecialWidget & > (*pw));
            //正確。傳遞給updateViaRef函數(shù)
            //?SpecialWidget?pw?指針,如果pw
            //?確實(shí)指向了某個(gè)對(duì)象
            //?否則將拋出異常
            dynamic_casts在幫助你瀏覽繼承層次上是有限制的。它不能被用于缺乏虛函數(shù)的類型上(參見(jiàn)條款M24),也不能用它來(lái)轉(zhuǎn)換掉constness:
            int?firstNumber,?secondNumber;

            double?result?=?dynamic_cast
            < double > (firstNumber)/secondNumber;
            //?錯(cuò)誤!沒(méi)有繼承關(guān)系
            const?SpecialWidget?sw;

            update(dynamic_cast
            < SpecialWidget * > ( &sw ));
            //?錯(cuò)誤!?dynamic_cast不能轉(zhuǎn)換
            //?掉const。
            如你想在沒(méi)有繼承關(guān)系的類型中進(jìn)行轉(zhuǎn)換,你可能想到static_cast。如果是為了去除const,你總得用const_cast。
            這四個(gè)類型轉(zhuǎn)換符中的最后一個(gè)是reinterpret_cast。使用這個(gè)操作符的類型轉(zhuǎn)換,其的轉(zhuǎn)換結(jié)果幾乎都是執(zhí)行期定義(implementation-defined)。因此,使用reinterpret_casts的代碼很難移植。
            reinterpret_casts的最普通的用途就是在函數(shù)指針類型之間進(jìn)行轉(zhuǎn)換。例如,假設(shè)你有一個(gè)函數(shù)指針數(shù)組:
            typedef?void?(*FuncPtr)();?//?FuncPtr?is?一個(gè)指向函數(shù)
            //?的指針,該函數(shù)沒(méi)有參數(shù)
            //?返回值類型為void
            FuncPtr?funcPtrArray[10];?//?funcPtrArray?是一個(gè)能容納
            //?10個(gè)FuncPtrs指針的數(shù)組
            讓我們假設(shè)你希望(因?yàn)槟承┠涿畹脑颍┌岩粋€(gè)指向下面函數(shù)的指針存入funcPtrArray數(shù)組:
            int?doSomething();
            你不能不經(jīng)過(guò)類型轉(zhuǎn)換而直接去做,因?yàn)閐oSomething函數(shù)對(duì)于funcPtrArray數(shù)組來(lái)說(shuō)有一個(gè)錯(cuò)誤的類型。在FuncPtrArray數(shù)組里的函數(shù)返回值是void類型,而doSomething函數(shù)返回值是int類型。
            funcPtrArray[0]?=?
            &doSomething; ?//?錯(cuò)誤!類型不匹配
            reinterpret_cast可以讓你迫使編譯?
            posted on 2006-04-16 22:56 笑笑生 閱讀(155) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


             
            Copyright © 笑笑生 Powered by: 博客園 模板提供:滬江博客
            青青草国产精品久久久久| 无码人妻精品一区二区三区久久| 九九精品99久久久香蕉| 激情伊人五月天久久综合| 久久青草国产精品一区| 久久精品视频91| 精品国产99久久久久久麻豆| 久久久一本精品99久久精品88| 88久久精品无码一区二区毛片| 亚洲精品无码久久毛片| 久久综合欧美成人| 狠狠色综合网站久久久久久久高清| 97精品伊人久久大香线蕉app | 久久精品水蜜桃av综合天堂| 狠狠色综合网站久久久久久久| 亚洲中文字幕久久精品无码喷水| 亚洲国产成人久久精品影视| 亚洲国产另类久久久精品| 精品无码人妻久久久久久| 久久精品国产亚洲av日韩| 亚州日韩精品专区久久久| 青青国产成人久久91网| 精品久久8x国产免费观看| 狠狠色丁香久久婷婷综合| 一本色综合久久| 无码任你躁久久久久久| 精品久久久久一区二区三区| 久久精品国产91久久麻豆自制| AV无码久久久久不卡蜜桃| 人妻精品久久久久中文字幕一冢本| 亚洲国产日韩欧美综合久久| 久久久久久久久久久免费精品| 精品999久久久久久中文字幕| 国产V综合V亚洲欧美久久| 精品永久久福利一区二区| 99久久精品国内| 亚洲一本综合久久| 久久99精品久久久久久齐齐| 久久精品二区| 亚洲国产日韩欧美久久| 国内精品综合久久久40p|