c primer讀書筆記 4 11 型別轉換

2021-07-16 00:09:19 字數 1774 閱讀 4391

c++ 不會直接將兩個不同型別的值進行運算,而是先根據型別轉換規則設法將運算物件的型別同一後再求值,上述的型別轉換時自動執行的,被稱作隱式轉換。

算術轉換的一般性原則是是運算不損失精度,所以通常運算子的運算物件會被轉換為最寬的型別。所以int與double型別相加時,int會被轉換為double型別。

如果乙個無符號型別與乙個帶符號型別進行計算,而且其中的無符號型別不小於帶符號型別,那麼帶符號型別會轉換為無符號型別。此時如果帶符號型別恰好是負數,則將產生出人意料的結果。

如果帶符號型別大於無符號型別,此時轉換的結果依賴於機器。如果無符號型別的所有值都能存在帶符號型別中,那麼無符號型別轉換為帶符號型別,否則,帶符號型別將轉換為無符號型別。

通常來說,我們應該避免讓無符號型別與帶符號型別一起參加運算。

陣列轉化為元素指標

0或者nullptr可以轉換為任意指標型別;指向任意非常量的指標可以轉換為void ,指向任意物件的指標可以轉換為const void 。

指標可以轉換為bool型別。

允許將指向非常量型別的指標轉換為指向相應的常量的指標,對於引用也是如此,可以將任何非常量引用轉換為常量引用,但是要注意,以上兩種轉換不可以逆向進行。

可以通過對類的一些處理,實現類型別定義的轉換。但是編譯器每次只能執行一種類型別的轉換

顯示轉換又稱為強制型別轉換。

c++提供四種強制型別轉換操作符static_cast,const_cast,dynamic_cast, reinterpret_cast.

任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static_const進行型別轉換。

當需要把乙個較大的算數型別轉換為較小的型別時,static_cast非常有用。一般編譯器發現乙個較大的算數型別試圖賦值給乙個較小的型別時,就會給出乙個警告資訊。但是如果使用static_cast進行顯示型別轉換之後,警告資訊就會被關閉。

const_cast只能改變物件的底層const。

一旦我們去掉了某個物件的const屬性,編譯器就不會再阻止我們隊該物件進行寫操作。如果物件本身不是乙個常量,使用強制型別轉換獲得寫許可權是合法的行為。然而如果物件是乙個常量,再使用const_cast執行寫操作就會產生未定義行為。

const

char *pc;

char *p = const_cast

(pc); //正確,但是通過p寫值是未定義的行為

const_cast常常用於有過載函式的上下文中。

reinterpret_cast通常為運算物件的位模式提供低層次上的重新解釋。

int *pi;

char *pc = reinterpret_cast

(pi); //我們必須牢記pc所指向的真實物件是乙個int而非乙個字元

string str(pc); //導致異常,因為pc實際指向的是乙個int物件,而不是乙個字元陣列

使用reinterpret_cast是非常危險的,其本質上依賴與機器,要想安全的使用它必須對涉及的型別和編譯器實現轉換的過程都非常了解。通常,最好不要使用reinterpret_cast。

type(expr) //函式形式的強制型別轉換

(type)expr //c風格

通常來說應該避免在程式中使用強制型別轉換,尤其是reinterpret_cast。如果要使用強制型別轉換,也應該使用c++提供的另外三種顯示轉換操作符來進行顯示型別轉換。

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...