總結一下c++的型別轉換:
(1)static_cast:實現了型別安全的「強制」型別轉換
這裡有還是必要說明一下的:
對於基礎資料型別,或內建資料型別,static_cast的作用基本等同於c語言的強制型別轉換;
而對於非內建型別(包括聯合體、結構體和類等),static_cast會對轉換前後的型別是否匹配、轉換是否合法進行檢查,這種檢查由c++編譯器提供——如果轉換不合法,則編譯器會給出錯誤——這就是c++為「強制」型別轉換提供的型別安全保證!
(2)const_cast:用於去除內建型別或物件的const或volatile屬性,當然,以前者為多。個人認為,應當盡量避免使用,如果真的要使用const_cast,得認真思考一下是不是設計上有可以改進的地方;
c++還有一種個人感覺較為奇特的去除變數const屬性的方法,**如下:
const int idata = 10;
(int&)idata = 12;
為什麼說奇特呢,首先引用&是c++引入的概念,但諸如(int&)這樣的強制型別轉換,有具有明顯的c風格。
(3)dynamic_cast:針對乙個繼承體系進行向下或橫向的型別安全轉換;
這裡有兩個不能:
1.不涉及繼承的類和內建型別,不能使用,主要是前者容易忽略需要注意一下;
2.型別引數中的型別沒有虛函式,不能使用(此時應使用static_cast);
顯然,由於額外的指標偏移操作等,dynamic_cast在執行效率上比static_cast要低一些。
另外需要注意的是,由於dynamic_cast不保證轉換成功,因此需要對其返回的結果進行判斷!
(4)reinterpret_cast:基本上用於函式指標之間的型別轉換。我曾經誤用於繼承體系中的型別轉換,貌似也沒問題。類似於const_cast,由於涉及函式指標轉換不可避免帶來**的不可移植性,因此盡量避免使用。
不得不說,c++的型別轉換寫法確實不夠優美,一般認為由於型別轉換本身具有一定的風險,而c++風格的型別轉換更容易識別(無論對於人、編譯器還是靜態**分析工具等等),簡化了在**中尋找型別系統被破壞的地方的過程;通過更精確地指定每乙個強制轉型的型別,使得編譯器診斷使用錯誤成為可能。例如,如果你試圖使用乙個 const_cast 以外的新風格強制轉型來消除常量性,你的**將無法編譯。
2023年9月29日:
對static_cast和dynamic_cast的說明進行修改和細化。
因為對這兩個型別轉換符的認識和理解不到位,導致之前的描述有誤,對可能誤導的讀者表示誠摯的歉意!
c 隱式型別轉換及c風格型別轉換的問題
上次的多執行緒系列因為某些原因暫時停了,後續會根據實際遇到的問題做一些補充。寫部落格是為了記錄我遇到的問題以及解決,便於自我總結,也幫助遇到這些問題的人。言歸正傳,本文介紹了c 以及c風格的強制型別轉換的一些注意點。問題描述 我在做報文解析的時候遇到這個問題 float x 32.128f floa...
C 風格的強制性型別轉換
顯示型別轉換 被稱為強制型別轉換 cast c風格 type id c 風格 static cast,dynamic cast,reinterpret cast,const cast 在 c 的設計和演化 中告訴我們,解決強制性型別轉換的最好的解決方法是使用標準的c 的型別轉換,也就是上面提到的四個...
C 型別轉換總結
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...