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