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