[原創(chuàng)文章歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息]
Justin 于 2009-12-31
好吧,我承認(rèn)2009最后一天我做了一次標(biāo)題黨……因?yàn)榇藯l規(guī)是讀到現(xiàn)在感覺寫得最糊涂的一條,理解起來自然也是稀里糊涂。所以需要“騙”來更多的高手來找碴:) 真實(shí)的題目應(yīng)該是盡量少用類型轉(zhuǎn)換。
大師先是復(fù)習(xí)了一下類型轉(zhuǎn)換的三種形式(前面兩種都是C風(fēng)格的舊式類型轉(zhuǎn)換):
Justin 于 2009-12-31
好吧,我承認(rèn)2009最后一天我做了一次標(biāo)題黨……因?yàn)榇藯l規(guī)是讀到現(xiàn)在感覺寫得最糊涂的一條,理解起來自然也是稀里糊涂。所以需要“騙”來更多的高手來找碴:) 真實(shí)的題目應(yīng)該是盡量少用類型轉(zhuǎn)換。
大師先是復(fù)習(xí)了一下類型轉(zhuǎn)換的三種形式(前面兩種都是C風(fēng)格的舊式類型轉(zhuǎn)換):
- (類型) 表達(dá)式
- 類型(表達(dá)式)
- C++風(fēng)格的類型轉(zhuǎn)換
- 容易程序中找到發(fā)生類型轉(zhuǎn)換的代碼(通過搜索轉(zhuǎn)換關(guān)鍵字)
- 新風(fēng)格的類型轉(zhuǎn)換細(xì)化了不同種類的類型轉(zhuǎn)換,有利于編譯器發(fā)現(xiàn)可能的錯(cuò)誤(編譯器啊編譯器……)
- const_cast:設(shè)置或是去除對(duì)象的const屬性。
- dynamic_cast:主要用于繼承關(guān)系層次中的向上、向下轉(zhuǎn)換,以及類之間的交叉轉(zhuǎn)換。會(huì)進(jìn)行轉(zhuǎn)換安全性檢查。
- static_cast:可用于內(nèi)置類型的轉(zhuǎn)換,以及繼承關(guān)系層次中的向上轉(zhuǎn)換。沒有轉(zhuǎn)換安全性檢查。
- reinterpret_cast:簡單的強(qiáng)制將一個(gè)指針轉(zhuǎn)換為另外一種指針或整數(shù)類型,不做任何檢查。
- 類型轉(zhuǎn)換還可能引發(fā)額外的代碼運(yùn)行。比如說dynamic_cast就會(huì)通過調(diào)用strcmp來比較類的名稱,從而完成繼承關(guān)系中不同類對(duì)象的轉(zhuǎn)換,這個(gè)時(shí)候就不僅僅是簡單的變變類型了。因此,說“類型轉(zhuǎn)換僅是告訴編譯器把一種類型的數(shù)據(jù)當(dāng)成另外一種來參與計(jì)算”其實(shí)是一個(gè)理解上的誤區(qū)。
-
類型轉(zhuǎn)換也有可能帶來額外開銷:比如書中用static_cast進(jìn)行的繼承關(guān)系的向上轉(zhuǎn)換,就會(huì)自作主張地生成一個(gè)臨時(shí)的對(duì)象。
- 在C++中,兩個(gè)指向同一個(gè)對(duì)象的不同指針可能擁有不同的地址值。【不理解,書上也沒有例子,股溝了很久也沒有答案,還請(qǐng)賜教】