您的位置:首頁(yè) >公共 >

C++ 類(lèi)型轉(zhuǎn)換

2023-03-28 21:09:48 來(lái)源:?jiǎn)袅▎袅?

隱式類(lèi)型轉(zhuǎn)換

1大多數(shù)表達(dá)式中,比int型小的整型值首先提升為較大的整數(shù)類(lèi)型

2在條件中,非bool值轉(zhuǎn)換為bool值


(相關(guān)資料圖)

3初始化過(guò)程中,初始值轉(zhuǎn)換成變量的類(lèi)型;在賦值語(yǔ)句中,右側(cè)運(yùn)算對(duì)象轉(zhuǎn)換成左側(cè)運(yùn)算對(duì)象的類(lèi)型。

4如果算術(shù)運(yùn)算或關(guān)系運(yùn)算的運(yùn)算對(duì)象有多種類(lèi)型,需要轉(zhuǎn)換成同一種類(lèi)型。(如double和int

5函數(shù)調(diào)用時(shí)也會(huì)發(fā)生類(lèi)型轉(zhuǎn)換。

算術(shù)轉(zhuǎn)換

算術(shù)轉(zhuǎn)換定義了一套類(lèi)型轉(zhuǎn)換的層次,其中運(yùn)算符的運(yùn)算對(duì)象將轉(zhuǎn)換成最寬的類(lèi)型。如long double參與了運(yùn)算,那么無(wú)論另外一個(gè)對(duì)象是什么類(lèi)型都會(huì)轉(zhuǎn)化為long double,還有既有浮點(diǎn)型也有整型的時(shí)候。

整型提升

把小整數(shù)的類(lèi)型轉(zhuǎn)換成較大的整數(shù)類(lèi)型

如 bool,char,signed char,unsigned char,short,unsigned short等,只要他們所有可能的值都在int中,他們就會(huì)提升為int,否則提升成unsigned int類(lèi)型。

較大的char類(lèi)型(wchar_t、char16_t、char32_t)提升為int、unsigned int、unsigned long、long long和unsigned long long中最小的一個(gè),前提是轉(zhuǎn)換后的能包含原類(lèi)型所有可能的值。

無(wú)符號(hào)類(lèi)型的運(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類(lèi)型的運(yùn)算對(duì)象轉(zhuǎn)換成unsigned int類(lèi)型,需注意如果int型恰好為負(fù)值,那么就會(huì)產(chǎn)生這種轉(zhuǎn)換的副作用,即轉(zhuǎn)換成不是我們本意的一個(gè)數(shù)。如果有符號(hào)類(lèi)型大于無(wú)符號(hào),則此轉(zhuǎn)換結(jié)果依賴(lài)于機(jī)器,如果無(wú)符號(hào)類(lèi)型的所有值都能存在該有符號(hào)的類(lèi)型中,則無(wú)符號(hào)轉(zhuǎn)換為有符號(hào),如果不能則有符號(hào)轉(zhuǎn)換為無(wú)符號(hào)。

其他隱式類(lèi)型轉(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è)引用來(lái)初始化數(shù)組,上述轉(zhuǎn)化也不會(huì)發(fā)生,后面我們將介紹,當(dāng)表達(dá)式中使用函數(shù)類(lèi)型時(shí)會(huì)發(fā)生類(lèi)似的指針轉(zhuǎn)換。

指針的轉(zhuǎn)換:常量整數(shù)值0或者字面值nullptr能轉(zhuǎn)換為任意指針類(lèi)型;指向任意非常量的指針能轉(zhuǎn)換成void*;指向任意對(duì)象的指針能轉(zhuǎn)換成const void*。后面會(huì)介紹有繼承關(guān)系的類(lèi)型間有一種指針轉(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,這種方法稱(chēng)之為強(qiáng)制類(lèi)型轉(zhuǎn)換。

注意:強(qiáng)制類(lèi)型轉(zhuǎn)換其實(shí)相當(dāng)?shù)奈kU(xiǎn)??!

命名的強(qiáng)制類(lèi)型轉(zhuǎn)換

一個(gè)命名的強(qiáng)制類(lèi)型轉(zhuǎn)換具有如下形式

cast-name<type>(expression)

type時(shí)轉(zhuǎn)換的目標(biāo)類(lèi)型而expression時(shí)要轉(zhuǎn)換的值。如果type時(shí)引用類(lèi)型,則結(jié)果時(shí)左值。

cast-name是static_cast、dynamic_cast、const_cast、reinterpret_cast中的一種,dynamic_cast支持運(yùn)行時(shí)類(lèi)型識(shí)別,我們以后做更詳細(xì)的介紹,cast-name執(zhí)行的是那種轉(zhuǎn)換。

static_cast

任何具有明確定義的類(lèi)型轉(zhuǎn)換,只要不包含底層const,都可以使用static_cast。例如將一個(gè)運(yùn)算對(duì)象強(qiáng)制轉(zhuǎn)換為double類(lèi)型就能使表達(dá)式執(zhí)行浮點(diǎn)數(shù)除法

const_cast

const_cast只能改變運(yùn)算對(duì)象的底層const

對(duì)于將常量對(duì)象轉(zhuǎn)換為非常量對(duì)象的行為,我們一般稱(chēng)為去掉const性質(zhì),一旦我們?nèi)サ袅四硞€(gè)對(duì)象的const性質(zhì),編譯器就不在阻止我們對(duì)該對(duì)象進(jìn)行寫(xiě)操作了。如果對(duì)象本身不是一個(gè)常量,使用強(qiáng)制類(lèi)型轉(zhuǎn)換獲得寫(xiě)權(quán)限時(shí)合法的行為。如果對(duì)象是一個(gè)常量,再使用const_cast執(zhí)行寫(xiě)操作就會(huì)產(chǎn)生未定義的后果。

const_cast不能用來(lái)改變表達(dá)式的類(lèi)型

reinterpret_cast

reinterpret_cast通常為運(yùn)算對(duì)象的位模式提供較低層次上的重新解釋。

這里pc所指的真是對(duì)象其實(shí)時(shí)int而非字符

除非對(duì)類(lèi)型和編譯器的轉(zhuǎn)換十分了解否則不要輕易使用reinterpret_cast。

舊式強(qiáng)制類(lèi)型轉(zhuǎn)換

根據(jù)類(lèi)型的不同,舊式強(qiáng)制轉(zhuǎn)換類(lèi)型分別具有const_cast、static_cast、或者reinterpret_cast相似的行為。當(dāng)我們執(zhí)行舊式強(qiáng)制類(lèi)型轉(zhuǎn)換時(shí),如果換成const_cast、static_cast也合法,則其行為與對(duì)應(yīng)的命名轉(zhuǎn)換一致,如果替換后不合法,則執(zhí)行于reinterpret_cast類(lèi)似的操作。

效果與reinterpret_cast一致。

運(yùn)算符優(yōu)先級(jí)表

標(biāo)簽:

相關(guān)文章

編輯推薦