青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Focus on ACE

訂閱 ace-china
電子郵件:
瀏覽存于 groups.google.com 上的所有帖子

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

double?result?=?((double)firstNumber)/secondNumber;
如果用上述新的類型轉(zhuǎn)換方法,你應(yīng)該這樣寫:
double?result?=?static_cast
< double > (firstNumber)/secondNumber;
這樣的類型轉(zhuǎn)換不論是對人工還是對程序都很容易識(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屬性。通過使用const_cast,你向人們和編譯器強(qiáng)調(diào)你通過類型轉(zhuǎn)換想做的只是改變一些東 西的?constness或者volatileness屬性。這個(gè)含義被編譯器所約束。如果你試圖使用const_cast來完成修改 constness?或者volatileness屬性之外的事情,你的類型轉(zhuǎn)換將被拒絕。下面是一些例子:
class?Widget?{??};
class?SpecialWidget:?public?Widget?{??};
void?update(SpecialWidget?*psw);
SpecialWidget?sw;?//?sw?是一個(gè)非const?對象。
const?SpecialWidget&?csw?=?sw;?//?csw?是sw的一個(gè)引用
//?它是一個(gè)const?對象
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)換掉對象的const屬性。
第 二種特殊的類型轉(zhuǎn)換符是dynamic_cast,它被用于安全地沿著類的繼承關(guān)系向下進(jìn)行類型轉(zhuǎn)換。這就是說,你能用dynamic_cast把指向基 類的指針或引用轉(zhuǎn)換成指向其派生類或其兄弟類的指針或引用,而且你能知道轉(zhuǎn)換是否成功。失敗的轉(zhuǎn)換將返回空指針(當(dāng)對指針進(jìn)行類型轉(zhuǎn)換時(shí))或者拋出異常 (當(dāng)對引用進(jìn)行類型轉(zhuǎn)換時(shí)):
Widget?*pw;

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

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

update(dynamic_cast
< SpecialWidget * > ( &sw ));
//?錯(cuò)誤!?dynamic_cast不能轉(zhuǎn)換
//?掉const。
如你想在沒有繼承關(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ù)沒有參數(shù)
//?返回值類型為void
FuncPtr?funcPtrArray[10];?//?funcPtrArray?是一個(gè)能容納
//?10個(gè)FuncPtrs指針的數(shù)組
讓我們假設(shè)你希望(因?yàn)槟承┠涿畹脑颍┌岩粋€(gè)指向下面函數(shù)的指針存入funcPtrArray數(shù)組:
int?doSomething();
你不能不經(jīng)過類型轉(zhuǎn)換而直接去做,因?yàn)閐oSomething函數(shù)對于funcPtrArray數(shù)組來說有一個(gè)錯(cuò)誤的類型。在FuncPtrArray數(shù)組里的函數(shù)返回值是void類型,而doSomething函數(shù)返回值是int類型。
funcPtrArray[0]?=?
&doSomething; ?//?錯(cuò)誤!類型不匹配
reinterpret_cast可以讓你迫使編譯??

posted on 2006-04-16 14:21 Stone Jiang 閱讀(1549) 評論(1)  編輯 收藏 引用 所屬分類: C++&OOPMiscellaneous

Feedback

# re: C++風(fēng)格的類型轉(zhuǎn)換的用法 (轉(zhuǎn)) 2006-04-17 14:01 jzp
很多時(shí)候明白是明白,就是嫌寫的麻煩。  回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩国产成人在线| 日韩一级在线| 亚洲国产欧美一区| 亚洲国产另类久久久精品极度| 亚洲欧美精品在线观看| 久久久久久久一区二区三区| 午夜日韩在线观看| 欧美亚洲综合网| 久久日韩精品| 欧美激情精品久久久久久免费印度 | 亚洲电影免费观看高清完整版在线| 久久久青草青青国产亚洲免观| 久久久久久久久综合| 欧美高清在线播放| 在线亚洲免费| 久久综合九色九九| 欧美精品在线观看91| 国产精品一区二区在线观看网站| 国产日韩精品在线| 亚洲国产欧美不卡在线观看| 中文在线资源观看网站视频免费不卡| 欧美亚洲三级| 亚洲国产精品久久久久秋霞影院| 一区二区三区日韩| 久久久久久免费| 欧美丝袜一区二区| 亚洲国产国产亚洲一二三| 亚洲专区国产精品| 欧美91大片| 亚洲深夜福利网站| 免费在线观看精品| 国产精品美女黄网| 最近看过的日韩成人| 性色av香蕉一区二区| 亚洲国产精品视频一区| 午夜亚洲福利| 欧美日韩在线视频首页| 亚洲福利视频三区| 久久精品国产久精国产思思| 一本久久综合亚洲鲁鲁| 免费在线欧美视频| 怡红院精品视频| 久久福利一区| 亚洲一级特黄| 欧美偷拍一区二区| 99re66热这里只有精品4| 久久久久久香蕉网| 99在线精品视频在线观看| 久久综合亚洲社区| 国产自产v一区二区三区c| 亚洲欧美乱综合| 99精品欧美一区二区三区综合在线| 久热精品视频| 国产亚洲欧洲| 久久精品99国产精品日本| 亚洲视频综合| 国产精品久久久久久久久久三级| 夜夜嗨av一区二区三区免费区| 欧美激情视频免费观看| 最新国产成人av网站网址麻豆 | 欧美福利精品| 伊人久久亚洲美女图片| 久久夜色撩人精品| 久久久99爱| 136国产福利精品导航| 欧美电影免费| 欧美激情黄色片| 日韩一本二本av| 日韩亚洲视频| 国产精品视频精品视频| 久久国产精品99国产精| 久久国产天堂福利天堂| 在线成人www免费观看视频| 欧美激情按摩在线| 欧美日韩精品综合在线| 亚洲欧美视频一区二区三区| 亚洲一区二区三区涩| 国产一区二区黄色| 欧美华人在线视频| 欧美日韩免费高清一区色橹橹| 亚洲天堂av综合网| 亚洲欧美在线播放| 雨宫琴音一区二区在线| 91久久久久久国产精品| 国产精品户外野外| 狂野欧美激情性xxxx欧美| 蜜桃伊人久久| 亚洲欧美三级在线| 久久综合亚州| 亚洲欧美日韩另类精品一区二区三区| 亚洲一二三区在线| 亚洲国产高清在线| 亚洲一级免费视频| 亚洲国产婷婷香蕉久久久久久99| 亚洲剧情一区二区| 国产一区欧美| 日韩视频在线观看一区二区| 国产亚洲成精品久久| 亚洲激情社区| 国产在线精品成人一区二区三区 | 美女日韩在线中文字幕| 一区二区三欧美| 久久国产精品99精品国产| 99在线热播精品免费| 欧美一区午夜精品| 国产精品99久久99久久久二8| 欧美在现视频| 一区二区三区久久久| 久久久久国产精品人| 亚洲欧美精品中文字幕在线| 久久综合久久综合久久| 欧美一区二区在线播放| 欧美精品乱人伦久久久久久 | 亚洲精品在线二区| 欧美一级久久久| 国产精品99免费看 | 免费亚洲电影在线| 欧美午夜视频在线观看| 亚洲黄色片网站| 精品成人国产| 欧美一区二区三区久久精品| 中文国产成人精品| 欧美**人妖| 免费美女久久99| 国模叶桐国产精品一区| 亚洲欧美日本国产专区一区| 一区二区三区蜜桃网| 欧美不卡视频| 欧美激情一区二区三区成人| 精品91视频| 久久久精品国产99久久精品芒果| 小辣椒精品导航| 国产精品国产a| 一区二区成人精品| 亚洲午夜极品| 欧美午夜精品理论片a级按摩| 亚洲国产女人aaa毛片在线| 国产无一区二区| 午夜久久黄色| 久久久久久香蕉网| 亚洲国产精品高清久久久| 久久综合狠狠综合久久激情| 另类亚洲自拍| 亚洲国产精品电影| 蜜臀av在线播放一区二区三区| 麻豆免费精品视频| 在线观看欧美一区| 久久精品人人做人人爽电影蜜月| 久久久久久自在自线| 极品少妇一区二区三区精品视频| 久久精品国产999大香线蕉| 久久久综合免费视频| 亚洲第一黄网| 欧美母乳在线| 亚洲在线一区二区三区| 久久爱另类一区二区小说| 黑人一区二区| 欧美r片在线| 一二三区精品福利视频| 欧美一区激情| 亚洲国产精品久久久久秋霞蜜臀 | 国产亚洲综合性久久久影院| 久久爱另类一区二区小说| 欧美成人影音| 亚洲午夜视频| 国内外成人免费视频| 欧美sm视频| 亚洲午夜av电影| 麻豆av福利av久久av| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩理论| 久久av资源网| 夜夜躁日日躁狠狠久久88av| 久久伊人一区二区| 亚洲免费在线看| 亚洲激情一区| 国产精品乱码久久久久久| 久久久噜噜噜久噜久久| 一本一本大道香蕉久在线精品| 久久国产精品亚洲va麻豆| 最新亚洲电影| 国产一区二区日韩精品欧美精品| 亚洲一区二区三区免费在线观看 | 午夜一区不卡| 亚洲理论在线观看| 国产一区白浆| 国产精品女人毛片| 欧美日韩不卡合集视频| 久久精品中文字幕一区| 一区二区三区蜜桃网| 欧美成人精品h版在线观看| 性一交一乱一区二区洋洋av| 亚洲伦理在线观看| 在线观看91精品国产入口| 国产精品丝袜白浆摸在线| 欧美日本久久| 欧美激情一区二区三区全黄 | 免费观看久久久4p| 久久激情五月婷婷| 亚洲欧美日韩综合|