• <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  
              愛過知情重醉過知酒濃   花開花謝終是空   緣份不停留像春風來又走   女人如花花似夢
            公告
            日歷
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567
            統計
            • 隨筆 - 8
            • 文章 - 91
            • 評論 - 16
            • 引用 - 0

            導航

            常用鏈接

            留言簿(4)

            隨筆分類(4)

            隨筆檔案(8)

            文章分類(77)

            文章檔案(91)

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

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

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

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

            double?result?=?dynamic_cast
            < double > (firstNumber)/secondNumber;
            //?錯誤!沒有繼承關系
            const?SpecialWidget?sw;

            update(dynamic_cast
            < SpecialWidget * > ( &sw ));
            //?錯誤!?dynamic_cast不能轉換
            //?掉const。
            如你想在沒有繼承關系的類型中進行轉換,你可能想到static_cast。如果是為了去除const,你總得用const_cast。
            這四個類型轉換符中的最后一個是reinterpret_cast。使用這個操作符的類型轉換,其的轉換結果幾乎都是執行期定義(implementation-defined)。因此,使用reinterpret_casts的代碼很難移植。
            reinterpret_casts的最普通的用途就是在函數指針類型之間進行轉換。例如,假設你有一個函數指針數組:
            typedef?void?(*FuncPtr)();?//?FuncPtr?is?一個指向函數
            //?的指針,該函數沒有參數
            //?返回值類型為void
            FuncPtr?funcPtrArray[10];?//?funcPtrArray?是一個能容納
            //?10個FuncPtrs指針的數組
            讓我們假設你希望(因為某些莫名其妙的原因)把一個指向下面函數的指針存入funcPtrArray數組:
            int?doSomething();
            你不能不經過類型轉換而直接去做,因為doSomething函數對于funcPtrArray數組來說有一個錯誤的類型。在FuncPtrArray數組里的函數返回值是void類型,而doSomething函數返回值是int類型。
            funcPtrArray[0]?=?
            &doSomething; ?//?錯誤!類型不匹配
            reinterpret_cast可以讓你迫使編譯?
            posted on 2006-04-16 22:56 笑笑生 閱讀(147) 評論(0)  編輯 收藏 引用
             
            Copyright © 笑笑生 Powered by: 博客園 模板提供:滬江博客
            中文字幕热久久久久久久| 久久成人国产精品一区二区| 伊人久久精品影院| 蜜臀久久99精品久久久久久小说| 色诱久久久久综合网ywww| 久久综合久久综合九色| 久久久久久极精品久久久| 久久国产精品无| 久久午夜电影网| 久久综合色老色| 99久久国产综合精品成人影院| 久久天天躁狠狠躁夜夜2020一| 久久精品这里热有精品| 香港aa三级久久三级老师2021国产三级精品三级在 | 亚洲精品99久久久久中文字幕 | 欧美久久精品一级c片片| 欧美日韩中文字幕久久久不卡| 一本色道久久综合亚洲精品| 国产亚洲色婷婷久久99精品91| 亚洲精品无码久久久久sm| 亚洲国产成人久久综合区| 亚洲午夜久久影院| 99久久人妻无码精品系列蜜桃 | 久久国产精品无| 国产99久久久久久免费看| 97久久久精品综合88久久| 国产69精品久久久久久人妻精品| 无码任你躁久久久久久久| 久久99精品久久久久久9蜜桃| 99久久99这里只有免费费精品| 777午夜精品久久av蜜臀| 精品国产日韩久久亚洲| 日韩久久久久中文字幕人妻| 久久亚洲中文字幕精品一区四| 久久九色综合九色99伊人| 99久久成人18免费网站| 久久99精品国产麻豆婷婷| 日韩中文久久| 亚洲国产另类久久久精品| 欧美亚洲色综久久精品国产 | 久久人人爽人人爽AV片|