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