一、隱式類型轉換
int m = 3 + 45.6; //48.6000000000 截斷為48,將小數部分進行截斷
二、C風格 顯式類型轉換(強制類型轉換)
//int k = 5 % 3.2; 編譯器報錯
int k = 5 %(int)3.2; //C語言風格的強制類型轉換,但需要程序員來保證數據正確可轉
int k = 5 % int(3.2); //函數風格的強制類型轉換(C語言風格的強制類型轉換中的一種)
int k = 5 %(int)"dddd"; //C語言風格的強制類型轉換,但結果肯定錯誤
//所以C語言風格的強制類型轉換是一種不安全的類型強制轉換
三、C++類型轉換
//C++出來支持C風格的類型轉換,但提供4中C++的強制類型轉換,分別用於不同的目的
//目的是為了提供豐富的含義和功能,更好的類型檢查機制,方便代碼的書寫與維護
1.static_cast
2.dynamic_cast
3.const_cast
4.reinterpret_cast
這四種強制類型轉換被稱為 "命名的強制類型轉換"
1.static_cast:靜態轉換(可以理解為C風格的強制類型轉換,但編譯器會檢查其合法性)
//通用形式
//強制類型轉換名<type>(express);1.static_cast:靜態轉換(可以理解為C風格的強制類型轉
換,但編譯器會檢查其合法性)
可用於
a.相關類型的轉換(如浮點型轉整型)
int i = static_cast<int> 100.0;
b.子類轉換為父類(繼承關系)
c.void *指針與其他指針之間的轉換(被強制轉換的是void *類型指針)
不可用於
a.一般不能用於不同類型指針之間的轉換
2.dynamic_cast:主要應用於 運行時類型識別與檢查。
主要用來父類型和子類型之間的轉換用(將父類型指針指向子類型對象)
3.const_cast:去除指針或引用的const屬性(編譯時進行類型轉換)不能進行不同類型之間的轉換
4.reinterpret_cast:重新解釋(處理無關類型的轉換)可以亂轉,安全性較差
常用於如下兩種類型的轉換
a.將整型轉換為指針
b.將一種類型的指針轉換為另一種類型的指針。
c.指針轉換為整型
四、總結
1.強制類型轉換均不建議使用,會抑制編譯器報錯
2. reinterpret_cast非常危險,const_cast使用則意味着設計缺陷
3. 如果實在需要進行強制類型轉換,則要使用C++風格的強制類型轉換
4. reinterpret_cast只要合乎規則的使用,則很好用