轉(zhuǎn)自]《c++強(qiáng)制轉(zhuǎn)化》http://topic.csdn.net/t/20041127/15/3593843.html
- static_cast用法:static_cast < type-id > ( expression ) 該運(yùn)算符把expression轉(zhuǎn)換為type-id類型葬燎,但沒(méi)有運(yùn)行時(shí)類型檢查來(lái)保證轉(zhuǎn)換的安全性宅粥。它主要有如下幾種用法:①用于類層次結(jié)構(gòu)中基類和子類之間指針或引用的轉(zhuǎn)換。進(jìn)行上行轉(zhuǎn)換(把子類的指針或引用轉(zhuǎn)換成基類表示)是安全的;進(jìn)行下行轉(zhuǎn)換(把基類指針或引用轉(zhuǎn)換成子類表示)時(shí)祝辣,由于沒(méi)有動(dòng)態(tài)類型檢查,所以是不安全的凌盯。②用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換徐矩,如把int轉(zhuǎn)換成char,把int轉(zhuǎn)換成enum窥淆。這種轉(zhuǎn)換的安全性也要開(kāi)發(fā)人員來(lái)保證卖宠。③把空指針轉(zhuǎn)換成目標(biāo)類型的空指針。④把任何類型的表達(dá)式轉(zhuǎn)換成void類型忧饭。
ui::Layout *addLine = static_cast<Layout*>(m_ligatureLine->clone());
注意:static_cast不能轉(zhuǎn)換掉expression的const扛伍、volitale、或者_(dá)_unaligned屬性词裤。
- dynamic_cast用法:dynamic_cast < type-id > ( expression )該運(yùn)算符把expression轉(zhuǎn)換成type-id類型的對(duì)象刺洒。Type-id必須是類的指針、類的引用或者void *吼砂;如果type-id是類指針類型逆航,那么expression也必須是一個(gè)指針,如果type-id是一個(gè)引用渔肩,那么expression也必須是一個(gè)引用因俐。dynamic_cast主要用于類層次間的上行轉(zhuǎn)換和下行轉(zhuǎn)換,還可以用于類之間的交叉轉(zhuǎn)換周偎。在類層次間進(jìn)行上行轉(zhuǎn)換時(shí)抹剩,dynamic_cast和static_cast的效果是一樣的;在進(jìn)行下行轉(zhuǎn)換時(shí)栏饮,dynamic_cast具有類型檢查的功能吧兔,比static_cast更安全。
注意:這里要求派生類中要有虛擬函數(shù)袍嬉,否則編譯不能夠通過(guò)境蔼。而static_cast則無(wú)此要求。
m_map =dynamic_cast<ui::ScrollView *>(node->getChildByName("scroll_map"));
- reinpreter_cast用法:reinpreter_cast < type-id > ( expression )type-id必須是一個(gè)指針伺通、引用箍土、算術(shù)類型、函數(shù)指針或者成員指針罐监。它可以把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù)吴藻,也可以把一個(gè)整數(shù)轉(zhuǎn)換成一個(gè)指針(先把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),再把該整數(shù)轉(zhuǎn)換成原類型的指針弓柱,還可以得到原先的指針值)沟堡。該運(yùn)算符的用法比較多侧但。
- const_cast用法:const_cast < type-id > ( expression )該運(yùn)算符用來(lái)修改類型的const或volatile屬性。除了const 或volatile修飾之外航罗, type_id和expression的類型是一樣的禀横。常量指針被轉(zhuǎn)化成非常量指針,并且仍然指向原來(lái)的對(duì)象粥血;常量引用被轉(zhuǎn)換成非常量引用柏锄,并且仍然指向原來(lái)的對(duì)象;常量對(duì)象被轉(zhuǎn)換成非常量對(duì)象复亏。dynamic_cast可用于繼承體系中的向下轉(zhuǎn)型趾娃,即將基類指針轉(zhuǎn)換為派生類指針,比static_cast更嚴(yán)格更安全缔御。dynamic_cast在執(zhí)行效率上比static_cast要差一些抬闷,但static_cast在更寬上范圍內(nèi)可以完成映射,這種不加限制的映射伴隨著不安全性耕突。static_cast覆蓋的變換類型除類層次的靜態(tài)導(dǎo)航以外饶氏,還包括無(wú)映射變換、窄化變換(這種變換會(huì)導(dǎo)致對(duì)象切片,丟失信息)有勾、用VOID*的強(qiáng)制變換、隱式類型變換等...
========================================== static_cast vs reinterpret_cast==========================================
reinterpret_cast是為了映射到一個(gè)完全不同類型的意思古程,這個(gè)關(guān)鍵詞在我們需要把類型映射回原有類型時(shí)用到它蔼卡。我們映射到的類型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險(xiǎn)的挣磨。(這句話是C++編程思想中的原話) static_cast 和 reinterpret_cast 操作符修改了操作數(shù)類型雇逞。它們不是互逆的; static_cast 在編譯時(shí)使用類型信息執(zhí)行轉(zhuǎn)換茁裙,在轉(zhuǎn)換執(zhí)行必要的檢測(cè)(諸如指針越界計(jì)算, 類型檢查). 其操作數(shù)相對(duì)是安全的塘砸。另一方面;reinterpret_cast 僅僅是重新解釋了給出的對(duì)象的比特模型而沒(méi)有進(jìn)行二進(jìn)制轉(zhuǎn)換晤锥, 例子如下:int n=9; double d=static_cast < double > (n); 上面的例子中, 我們將一個(gè)變量從 int 轉(zhuǎn)換到 double掉蔬。 這些類型的二進(jìn)制表達(dá)式是不同的。 要將整數(shù) 9 轉(zhuǎn)換到 雙精度整數(shù) 9矾瘾,static_cast 需要正確地為雙精度整數(shù) d 補(bǔ)足比特位女轿。其結(jié)果為 9.0。而reinterpret_cast 的行為卻不同:
int n=9; double d=reinterpret_cast (n);
這次, 結(jié)果有所不同. 在進(jìn)行計(jì)算以后, d 包含無(wú)用值. 這是因?yàn)?reinterpret_cast 僅僅是復(fù)制 n 的比特位到 d, 沒(méi)有進(jìn)行必要的分析. 因此, 你需要謹(jǐn)慎使用 reinterpret_cast.
原文鏈接:http://blog.csdn.net/hanchaoman/article/details/6104883