<fieldset id="26ue2"><table id="26ue2"></table></fieldset>
  • <ul id="26ue2"></ul>
  • <center id="26ue2"></center>
    您的位置:首頁 >公共 >

    C++ 類型轉換

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

    隱式類型轉換

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

    2在條件中,非bool值轉換為bool值


    (相關資料圖)

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

    4如果算術運算或關系運算的運算對象有多種類型,需要轉換成同一種類型。(如double和int

    5函數調用時也會發生類型轉換。

    算術轉換

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

    整型提升

    把小整數的類型轉換成較大的整數類型

    如 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型恰好為負值,那么就會產生這種轉換的副作用,即轉換成不是我們本意的一個數。如果有符號類型大于無符號,則此轉換結果依賴于機器,如果無符號類型的所有值都能存在該有符號的類型中,則無符號轉換為有符號,如果不能則有符號轉換為無符號。

    其他隱式類型轉換

    數組轉換為指針:大多數用到數組的表達式中,數組自動轉換指向數組首元素的指針

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

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

    轉換為常量:允許將非常量指針轉換成指向相應常量的指針,引用同樣如此

    不能試圖刪掉底層的const。

    顯示轉換

    有時候我們想將一種對象強制轉換為另一種對象。

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

    注意:強制類型轉換其實相當的危險!!

    命名的強制類型轉換

    一個命名的強制類型轉換具有如下形式

    cast-name<type>(expression)

    type時轉換的目標類型而expression時要轉換的值。如果type時引用類型,則結果時左值。

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

    static_cast

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

    const_cast

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

    對于將常量對象轉換為非常量對象的行為,我們一般稱為去掉const性質,一旦我們去掉了某個對象的const性質,編譯器就不在阻止我們對該對象進行寫操作了。如果對象本身不是一個常量,使用強制類型轉換獲得寫權限時合法的行為。如果對象是一個常量,再使用const_cast執行寫操作就會產生未定義的后果。

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

    reinterpret_cast

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

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

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

    舊式強制類型轉換

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

    效果與reinterpret_cast一致。

    運算符優先級表

    標簽: