c語言裡將型別符號作為強制型別轉換運算子的做法在c++中得到了相容,但是c++中引入了四種功能不同的強制型別轉換運算子:static_cast、reinterpret_cast、const_cast、dynamic_cast
1.為什麼要新增四種強制型別轉換?
強制型別轉換具有一定風險,如:把整型轉換為指標型別、將基類指標轉換為派生類指標、將一種函式指標轉換為另一種函式指標,將常量指標轉換為非常量指標等。c++新引用四種強制型別轉換主要是為了規避這種風險:
a. 將int轉換為double是沒有風險的,而將常量指標轉換為非常量指標,將int轉換為指標型別都是高風險的,c中並未對這兩種情況作區分
b. 將多型的基類指標轉換為派生類指標時並不檢查安全性,無法判斷轉換後的指標是否指向乙個派生類物件
c. 如果強制型別轉換出錯,很難排查出錯誤
2.c++中強制型別轉換運算子的用法
強制型別轉換運算子《要轉換的型別》(待轉換的表示式)
如:double num = static_cast (1+2); // 將1+2轉換為浮點型別3.static_cast
static_cast主要用於「低風險」的型別轉換,如整數、浮點數和字元型別的轉換,如果物件過載了強制型別轉換運算子t(t是int、char或其他型別),則static_cast也可以用於將物件轉換為t型別;而像整型和指標這種「高風險」的轉換,static_cast就無法使用了
#include
using
namespace std;
class
aoperator
char*(
)};int
main()
4.reinterpret_cast
前面說到,「高風險」的型別轉換無法用static_cast解決,因此,c++中使用reinterpret_cast解決這種轉換問題,在使用reinterpret_cast時,使用的是逐個位元位複製的操作,它支援各種不同型別的指標之間、不同型別的引用之間以及指標和能容納指標的整數之間的轉換,reinterpret_cast提供了很高的靈活性,但是這種轉換的後果卻不保證安全性,因此要慎用。
#include
using
namespace std;
classa}
;bool
func
(int x)
intmain()
5.const_cast
const_cast運算子主要是為了去除const屬性,它是四種強制型別轉換運算子中唯一乙個可以去除const屬性的運算子
const string str =
"this is a test."
;string& rs =
const_cast
>
(str)
;string* ps =
const_cast
>
(&str)
;// &str的型別是,const string*;
6.dynamic_cast
使用reinterpret_cast用於將多型基類指標強制轉換為派生類指標,但是這種轉換不保證安全性,即不檢查轉換後的指標是否指向乙個派生類物件,dynamic_cast專門用於將多型基類型別的指標強制轉換為派生類型別的指標,而且能夠檢查轉換的安全性,對於不安全的轉換,返回乙個nullptr
dynamic_cast是通過「執行時型別檢查」來保證安全性的。但是,dynamic_cast 不能用於將非多型基類的指標或引用強制轉換為派生類的指標或引用—dynamic_cast只能用於轉換具有虛函式的類—這種轉換沒法保證安全性。
#include
#include
using
namespace std;
class
base};
class
derived
:public base
;int
main()
特殊情況
如果derived & r = dynamic_cast (b);
那該如何判斷該轉換是否安全呢?不存在空引用,因此不能通過返回值來判斷轉換是否安全。
dynamic_cast 在進行引用的強制轉換時,如果發現轉換不安全,就會丟擲乙個異常,通過處理異常,就能發現不安全的轉換。
7.explict 關鍵字
explict的作用是阻止經過轉換建構函式進行的隱式轉換的生成
#include
using
namespace std;
classaa
(const a& a)
private
:int _a;};
intmain()
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 四種強制型別轉換
1 概述 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。2 詳解加示例 a const cast 用法 const cast 型別 表示式 用途 刪除con...
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...