1. 程式人生 > >C++中的型別轉換規則

C++中的型別轉換規則

<分析>:任何一個操作符在運算之前其運算元的型別必須一致,如果不一致必須進行型別轉換,對不同型別之間的轉換規則總結如下:

(1)整型提升:

  在算術運算中,對於所有比int型小的整型,包括char,signed char,unsigned char,short,unsigned short,如果該型別所有可能值都包含在int內,它們就被提升為int,否則將被提升為unsigned int。也就是在計算前不管算式中有無int,都會被提升為int。

(2)如果算式中存在同一型別的有符號和無符號的表示式,signed的型別被轉換為unsigned。

(3)型別轉換是確保精度優先的條件下進行的(long double>double>float>unsigned long>long>unsigned int>int)。

(4)任何資料型別的指標都可以轉換為void*型別,整數0可以轉換為任何指標型別。

(5)列舉對象或者列舉成員轉換為整型時至少提升為int型。

(6)非const物件可以初始化const物件,同時可以將非const型別物件的地址轉化為執行const型別的指標。

(7)強制型別轉換:

   ①daynamic_cast:執行時識別指標或者引用所指向的物件。實現類繼承物件之間的轉換,可以將基類型別引用或者指標安全的轉換為派生類引用或者指標;

   ②const_cast:轉換掉表示式中的const性質;

   ③static_cast:隱式執行的任何型別轉換都可以由static_cast顯示完成,可以用這個轉換找回存放在void指標中的值;

   ④reinterpret_cast,實現本來不能轉換的類進行轉換,是不安全的資料型別轉換;

(8)類型別轉換:

   ①類型別轉換前後都可以有標準型別轉換;

   ②一個表示式中只能有一個類型別轉換;

(9)新式強制型別轉換的優點:

   ①很容易在程式碼中被辨認出來,因而得以簡化“找出型別系統的哪個地點被破壞”的過程。

   ②各轉型動作目標越狹窄,編譯器越能診斷出錯誤的運用。

   ③舊的型別轉換任何型別都可以轉換,但是不安全。

(10)如果可以,儘量避免轉型,因為像dynamic_cast這樣的轉型很浪費時間,如果必須轉換,儘量把轉型放在函式裡,客戶可以呼叫函式,而不是將轉型放在自己的程式碼裡: