隱式類型轉換
1大多數(shù)表達式中,比int型小的整型值首先提升為較大的整數(shù)類型
2在條件中,非bool值轉換為bool值
(相關資料圖)
3初始化過程中,初始值轉換成變量的類型;在賦值語句中,右側運算對象轉換成左側運算對象的類型。
4如果算術運算或關系運算的運算對象有多種類型,需要轉換成同一種類型。(如double和int
5函數(shù)調用時也會發(fā)生類型轉換。
算術轉換
算術轉換定義了一套類型轉換的層次,其中運算符的運算對象將轉換成最寬的類型。如long double參與了運算,那么無論另外一個對象是什么類型都會轉化為long double,還有既有浮點型也有整型的時候。
整型提升
把小整數(shù)的類型轉換成較大的整數(shù)類型
如 bool,char,signed char,unsigned char,short,unsigned short等,只要他們所有可能的值都在int中,他們就會提升為int,否則提升成unsigned int類型。
較大的char類型(wchar_t、char16_t、char32_t)提升為int、unsigned int、unsigned long、long long和unsigned long long中最小的一個,前提是轉換后的能包含原類型所有可能的值。
無符號類型的運算對象
如果一個運算對象是有符號另一個是無符號,其中無符號不小于由符號,那么有符號的運算對象會轉換為無符號,如unsigned int和int,則int類型的運算對象轉換成unsigned int類型,需注意如果int型恰好為負值,那么就會產(chǎn)生這種轉換的副作用,即轉換成不是我們本意的一個數(shù)。如果有符號類型大于無符號,則此轉換結果依賴于機器,如果無符號類型的所有值都能存在該有符號的類型中,則無符號轉換為有符號,如果不能則有符號轉換為無符號。
其他隱式類型轉換
數(shù)組轉換為指針:大多數(shù)用到數(shù)組的表達式中,數(shù)組自動轉換指向數(shù)組首元素的指針
當數(shù)組作為取址符&、sizeof、typeid(后面將介紹)等運算符的運算對象時,上述轉換不會發(fā)生,同樣的如果用一個引用來初始化數(shù)組,上述轉化也不會發(fā)生,后面我們將介紹,當表達式中使用函數(shù)類型時會發(fā)生類似的指針轉換。
指針的轉換:常量整數(shù)值0或者字面值nullptr能轉換為任意指針類型;指向任意非常量的指針能轉換成void*;指向任意對象的指針能轉換成const void*。后面會介紹有繼承關系的類型間有一種指針轉換方式。
轉換為常量:允許將非常量指針轉換成指向相應常量的指針,引用同樣如此
不能試圖刪掉底層的const。
顯示轉換
有時候我們想將一種對象強制轉換為另一種對象。
如果我們希望上面的代碼強行執(zhí)行浮點數(shù)除法就要使用某種方法將i或j顯式的轉換成double,這種方法稱之為強制類型轉換。
注意:強制類型轉換其實相當?shù)奈kU!!
命名的強制類型轉換
一個命名的強制類型轉換具有如下形式
cast-name<type>(expression)
type時轉換的目標類型而expression時要轉換的值。如果type時引用類型,則結果時左值。
cast-name是static_cast、dynamic_cast、const_cast、reinterpret_cast中的一種,dynamic_cast支持運行時類型識別,我們以后做更詳細的介紹,cast-name執(zhí)行的是那種轉換。
static_cast
任何具有明確定義的類型轉換,只要不包含底層const,都可以使用static_cast。例如將一個運算對象強制轉換為double類型就能使表達式執(zhí)行浮點數(shù)除法
const_cast
const_cast只能改變運算對象的底層const
對于將常量對象轉換為非常量對象的行為,我們一般稱為去掉const性質,一旦我們去掉了某個對象的const性質,編譯器就不在阻止我們對該對象進行寫操作了。如果對象本身不是一個常量,使用強制類型轉換獲得寫權限時合法的行為。如果對象是一個常量,再使用const_cast執(zhí)行寫操作就會產(chǎn)生未定義的后果。
const_cast不能用來改變表達式的類型
reinterpret_cast
reinterpret_cast通常為運算對象的位模式提供較低層次上的重新解釋。
這里pc所指的真是對象其實時int而非字符
除非對類型和編譯器的轉換十分了解否則不要輕易使用reinterpret_cast。
舊式強制類型轉換
根據(jù)類型的不同,舊式強制轉換類型分別具有const_cast、static_cast、或者reinterpret_cast相似的行為。當我們執(zhí)行舊式強制類型轉換時,如果換成const_cast、static_cast也合法,則其行為與對應的命名轉換一致,如果替換后不合法,則執(zhí)行于reinterpret_cast類似的操作。
效果與reinterpret_cast一致。
運算符優(yōu)先級表
標簽: