標籤:

為什麼在 C++ 中不提倡 C 風格的強制類型轉換?


其中一個原因是,C++ 具有繼承, 	exttt{static_cast}	exttt{dynamic_cast} 可表示向下轉型。

使用多個關鍵字來做不同的 casting,能減少歧義,令代碼更清晰易理解。


C式轉換在C++中是由多種語義混合的轉換,表意不明。明確指出轉換的目的,能讓編譯器幫助你查出可能存在的錯誤,同時也走了一遍腦子,不會一時腦抽寫錯代碼


C式轉換的語義包括:算數類型之間轉換,繼承鏈上的向上和向下轉型,const volatile的增減,指針別名(pointer aliasing)的構造,轉換運算符重載和隱式單參構造


C 風格轉型實際上是 static_cast (加上一些破壞訪問許可權設定的擴充)或 reinterpret_cast 伴隨 const_cast 的組合。不會同時有 static_cast 和 reinterpret_cast 。

注意這個 const_cast ,使用它往往意味著違背合理的邏輯。若混在 C 風格轉型里就不太容易注意到了。


C++當時發明了繼承和const,完全可以禁止C語言的類型轉換語法用在帶有繼承關係的類型和const轉換上面的,不知道為什麼要允許。誰會專門去用長的語法。

造成的後果之一就是,C++再也不保證(T*)e不改變指針的值了(逃


因為C++不提倡類型轉換。

所以才會有分類清楚並且醜化的類型轉換,本質上是因為它想讓你能不用就不用。

類型系統的靜態閉環是c++重要的特色,在業務代碼里,你應該根本不可能用到const_cast和static_cast,更何況reinterpret_cast。


C++里如果用到了cast,只需要文本搜索一下即可,如果C程序裡面到處散落著各種轉換,要如何做code review呢?


有一種說法是 casting is ugly and should be ugly.

An ugly operation should have an ugly syntactic form.


個人覺得不是提不提倡的問題,是不清楚自己要幹什麼,非得把一個a轉換成毫不相關的b,用什麼語言都不行


推薦閱讀:

你讀過的最好的 C++ 開源代碼是什麼?
C++17 基本完成,對於新特性大家怎麼看?
C/C++中相同的浮點數的內存布局一定是一樣嗎?
只使用 C++ 標準語法和標準庫如何做出優美的人機界面?
如何用 C++ 在 10 行內寫出八皇后?

TAG:C |