您的位置:首頁 >公共 >

C++ 類型轉(zhuǎn)換

2023-03-28 21:09:48 來源:嗶哩嗶哩

隱式類型轉(zhuǎn)換

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

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


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

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

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

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

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

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

整型提升

把小整數(shù)的類型轉(zhuǎn)換成較大的整數(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中最小的一個,前提是轉(zhuǎn)換后的能包含原類型所有可能的值。

無符號類型的運算對象

如果一個運算對象是有符號另一個是無符號,其中無符號不小于由符號,那么有符號的運算對象會轉(zhuǎn)換為無符號,如unsigned int和int,則int類型的運算對象轉(zhuǎn)換成unsigned int類型,需注意如果int型恰好為負值,那么就會產(chǎn)生這種轉(zhuǎn)換的副作用,即轉(zhuǎn)換成不是我們本意的一個數(shù)。如果有符號類型大于無符號,則此轉(zhuǎn)換結(jié)果依賴于機器,如果無符號類型的所有值都能存在該有符號的類型中,則無符號轉(zhuǎn)換為有符號,如果不能則有符號轉(zhuǎn)換為無符號。

其他隱式類型轉(zhuǎn)換

數(shù)組轉(zhuǎn)換為指針:大多數(shù)用到數(shù)組的表達式中,數(shù)組自動轉(zhuǎn)換指向數(shù)組首元素的指針

當數(shù)組作為取址符&、sizeof、typeid(后面將介紹)等運算符的運算對象時,上述轉(zhuǎn)換不會發(fā)生,同樣的如果用一個引用來初始化數(shù)組,上述轉(zhuǎn)化也不會發(fā)生,后面我們將介紹,當表達式中使用函數(shù)類型時會發(fā)生類似的指針轉(zhuǎn)換。

指針的轉(zhuǎn)換:常量整數(shù)值0或者字面值nullptr能轉(zhuǎn)換為任意指針類型;指向任意非常量的指針能轉(zhuǎn)換成void*;指向任意對象的指針能轉(zhuǎn)換成const void*。后面會介紹有繼承關(guān)系的類型間有一種指針轉(zhuǎn)換方式。

轉(zhuǎn)換為常量:允許將非常量指針轉(zhuǎn)換成指向相應(yīng)常量的指針,引用同樣如此

不能試圖刪掉底層的const。

顯示轉(zhuǎn)換

有時候我們想將一種對象強制轉(zhuǎn)換為另一種對象。

如果我們希望上面的代碼強行執(zhí)行浮點數(shù)除法就要使用某種方法將i或j顯式的轉(zhuǎn)換成double,這種方法稱之為強制類型轉(zhuǎn)換。

注意:強制類型轉(zhuǎn)換其實相當?shù)奈kU?。?/p>

命名的強制類型轉(zhuǎn)換

一個命名的強制類型轉(zhuǎn)換具有如下形式

cast-name<type>(expression)

type時轉(zhuǎn)換的目標類型而expression時要轉(zhuǎn)換的值。如果type時引用類型,則結(jié)果時左值。

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

static_cast

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

const_cast

const_cast只能改變運算對象的底層const

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

const_cast不能用來改變表達式的類型

reinterpret_cast

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

這里pc所指的真是對象其實時int而非字符

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

舊式強制類型轉(zhuǎn)換

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

效果與reinterpret_cast一致。

運算符優(yōu)先級表

標簽: