c++中有四中強制型別轉換:static_cast,const_cast,reinterpret_cast,dynamic_cast,下面來逐一解釋。
1)static_cast(a)
將位址a轉換成型別t,t和a必須是指標、引用、基本資料型別或列舉型別。在執行時轉換過程中,不進行型別檢查來確保轉換的安全性。
class b ;
class d : public b ;
void f(b* pb, d* pd)
在c++語言中static_cast用於資料型別的強制轉換,強制將一種資料型別轉換為另一種資料型別。例如將整型資料轉換為浮點型資料,它主要有如下幾種用法:
(1)用於類層次結構中基類和派生類之間指標或引用的轉換,進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的,進行下行轉換(把基類的指標或引用轉換為派生類表示),由於沒有動態型別檢查,所以是不安全的。
(2)用於基本資料型別之間的轉換,如把int轉換成char。這種轉換的安全也要開發人員來保證
(3)把空指標轉換成目標型別的空指標
(4)把任何型別的表示式轉換為void型別
注意:static_cast不能轉換掉expression的const、volitale或者__unaligned屬性。
2)dynamic_cast(a)
完成類層次結構中的提公升,t必須是乙個指標、引用或無型別的指標。a必須是決定乙個指標或引用的表示式。表示式dynamic_cast(a) 將a值轉換為型別為t的物件指標。如果型別t不是a的某個基型別,該操作將返回乙個空指標。
class a ;
class b ;
void f()
用法:dynamic_cast(expression)
(1)其他三種都是編譯時完成的,dynamic_cast是執行時處理的,執行時要進行型別檢查。
(2)不能用於內建的基本資料型別的強制轉換。
(3)dynamic_cast轉換如果成功的話返回的是指向類的指標或引用,轉換失敗的話則會返回null。
(4)使用dynamic_cast進行轉換的,基類中一定要有虛函式,否則編譯不通過。
需要檢測有虛函式的原因:類中存在虛函式,就說明它有想要讓基類指標或引用指向派生類物件的情況,此時轉換才有意只有定義了虛函式的類才有虛函式表。
3)const_cast(a)
去掉型別中的常量,除了const或不穩定的變址數,t和a必須是同型別。表示式const_cast(a)被用於從乙個類中去除以下屬性:const、volatile和_unaligned。
class a ;
void f()
const_cast是用於強制去掉這種不能被修改的常數特性,但需要特別注意的是const_cast不是用於去除變數的常量性,而是去除指向常數物件的指標或引用的常量性,其去除常量性的物件必須為指標或引用。
用法:const_cast(expression)
(1) 該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。
(2)常量指標被轉化成非常量指標,並且仍然指向原來的物件;
(3)常量引用被轉換成非常量引用,並且仍然指向原來的物件;常量物件被轉換成非常量物件。
4) reinterpret_cast(a)
任何指標都可以轉換成其它型別的指標,t必須是乙個指標、引用、算術型別、指向函式的指標或指向乙個類成員的指標。表示式reinterpret_cast(a)能夠用於將char*到int*,或者one_class*到unrelated_class*等類似這樣的轉換,因此是不安全的。
class a ;
class b ;
void f()
在c++語言中,reinterpret_cast主要有三種強制轉換用途:改變指標或引用的型別、將指標或引用轉換為乙個足夠長度的整形、將整型轉換為指標或引用型別。
用法:reinterpret_cast(expression)
(1) type-id必須是乙個指標、引用、算術型別、函式指標或者成員指標。
(2) 它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,在把該整數轉換成原型別的指標,還可以得到原先的指標值)。
注意:在使用reinterpret_cast強制轉換過程僅僅只是位元位的拷貝,因此在使用過程中需要特別謹慎!
參考:
四大強制轉換符
在c 中主要有四種強制型別轉換 static cast,reinterpret cast,const cast,dynamic cast。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 基本資料型別或列舉型別。在執行時轉換過程中,不進行型別檢查來確保轉換的安全性。cla...
C 四大型別轉換
c 是一門強型別語言 相比c 來說c語言是弱型別語言 不同自定義型別之間的轉換必須進行顯式轉換。c 中也有隱式型別轉換,所以關於c 到底是強型別語言還是弱型別語言是乙個比較尷尬的問題。c 中提供了四種轉換操作符來細分顯式型別轉換。因為是操作符,所以他們不屬於任何的namespace,也就不用包含任何...
C 四大型別轉換
c語言的型別轉換比較自由,但也帶來了一些問題,這些問題大多由程式設計師自行控制和解決。對於龐大的c 語言機制而言,這種簡單粗暴的型別轉換方式顯然是個巨大的負擔,因此c 引入4種型別轉換運算子,更加嚴格的限制允許的型別轉換,使轉換過程更加規範 dynamic cast 用於多型型別的轉換 static...