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