1、顯示轉換
將物件顯示地強制轉換成另一種型別。
2、命名的強制型別轉換
①形式: cast-name< type >(expression);
cast_name可以是static_cast、dynamic_cast、const_cats、reinterpret_cast。
type:是要轉換成的型別
expression:是要轉換的值。
3、static_cast
底層const:表示指標指向的物件是乙個常量。比如:const int *p;
①除了底層const,任何具有明確定義的型別轉換,都可以使用static_cast。即指向常量的指標不能轉換成指向非常量的指標,使用static_cast不能去掉底層const。
②static_cast可以把乙個較大的算術型別負值給較小的型別,且編譯器不會發出警告。
③static_cast對於編譯器無法自動執行的型別轉換也非常有用。例如,我們可以使用static_cast來找回存在於void*指標中的值。
注意:當我們把指標存放在void星號中,並且使用static_cast將其強制轉換回原來的型別時,應該確保指標的值保持不變,即位址保持不變。
4、const_cast
①作用:const_cast只能改變運算物件的底層const,即將常量物件轉換成非常量物件的行為。
②注意:如果物件本身不是乙個常量,使用強制型別轉換獲得寫許可權是合法的行為。然而如果物件是乙個常量,再使用const_cast執行寫操作就會產生未定義的後果。
③只有const_cast能改變表示式的常量屬性,使用其他形式的命名強制型別轉換改變表示式的常量屬性都將引發編譯器錯誤。同樣的,也不能用const_cast改變表示式的型別。
比如:const char *pc;
char *pa=const_cast(pc); //是錯誤的,const_cast只能改變常量屬性,不能改變型別。
5、reinterpret_cast
①作用:reinterpret_cast通常為運算物件的位模式提供較低層次上的重新解釋。
位模式:計算機所有二進位制的0、1**組成的數字串
②reinterpret_cast可以把物件強制轉換成任意一種型別,但是實際上它還是原來的型別,不過在型別轉換過後,編譯器認定它是轉換後的型別,用它來做某些操作編譯器並不認定這些行為是錯誤。
因為使用reinterpret_cast來顯示地宣告這種轉換是合法的,所以編譯器不會發出警告或錯誤的資訊。
但這只是物件在表面上轉換成了另外一種型別,但實際上它還是原來的型別,沒有發生改變。唯一的區別就是騙過了編譯器,使之不能發現編譯錯誤。
比如:int *p;char *pc=reinterpret_cast< char xing>(pc);
由上分析,p原來是指向int的指標,經過reinterpret_cast型別轉換後變成指向char的指標。
pc實際存放的指向int的指標,可以用pc來儲存某個字元變數的位址,且編譯器不會發出錯誤發出錯誤的警告,但是這樣的操作是未定義的,是沒有意義的。
6、舊式的強制型別轉換
①有兩種形式:
type(expr); //函式形式的強制型別轉換
(type) expr; //c語言風格的強制型別轉換
②如果舊式的強制型別轉換可以用static_cast或const_cast來替換,則行為和替換後的強制型別轉換的形式相同。
如果不可以替換,那麼就和reinterpret_cast的強制型別轉換相同。
c primer讀書筆記 4 11 型別轉換
c 不會直接將兩個不同型別的值進行運算,而是先根據型別轉換規則設法將運算物件的型別同一後再求值,上述的型別轉換時自動執行的,被稱作隱式轉換。算術轉換的一般性原則是是運算不損失精度,所以通常運算子的運算物件會被轉換為最寬的型別。所以int與double型別相加時,int會被轉換為double型別。如果...
強制型別轉換 (c primer)
命名的強制型別轉換符號的一般形式如下 cast name expression 其中 cast name 為 static cast dynamic cast const cast 和reinterpret cast 之一,type 為轉換的目標型別,而 expression 則是被強制轉換的值。強...
C Primer顯示型別轉換
乙個命名的強制型別轉換形式 cast name expression type是轉換型別,如果是引用型別,返回左值,即位址物件 cast name 1.static cast 不包含底層const 底層const 指標指向的物件是常量 的任何具有明確定義的型別轉換。用處 1.將較大的算術型別轉換給較...