c++有哪四个类型转换相关的关键字
【面試題】c++有哪四個類型轉換相關的關鍵字?
在C/C++語言中用 (type) value(在C++還可以采用type(value))來進行顯式類型轉換(explicit type conversion),常常又被稱為強制轉換(cast投射/鑄模)。這種轉換的正確性完全掌握在程序員手中,傳統上強制轉換往往被過度使用,成為C++程序犯錯的一個主要根源。
為了減少強制轉換的副作用,并且在查錯時使程序員能夠快速定位(總是最值得懷疑的)強制轉換,在標準C++中新增加了4個關鍵字*_cast,用來提倡一種全新的C++顯式轉換語法:
*_cast <type-id> (expression)
[cpp]?view plain?copy
1、reinterpret_cast<type-id> (expression)
type-id 必須是一個指針、引用、算術類型、函數指針或者成員指針。它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,再把該整數轉換成原類型的指針,還可以得到原先的指針值)。
static_cast和reinterpret_cast的區別主要在于多重繼承reinterpret_cast(重解釋轉換):一種最有可能出問題的最不安全的類型轉換。只是在下面的情形,才需要使用這種類型轉換:當需要使用時,所得到的東西已經不同了,為了使它能夠用于原來的目的,必須再次把它轉換回來。例如:
[cpp]?view plain?copy
使用reinterpret_cast通常是一種不明智且不方便的編程方式。但是在必須使用時,它也是非常有用的。
2、static_cast<T*>(content)靜態轉換
主要用于c++中內置的基本數據類型之間的轉換,在編譯期間處理,但是沒有運行時類型的檢測來保證轉換的安全性。
該運算符把expression轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:
①用于類層次結構中基類(父類)和派生類(子類)之間指針或引用的轉換。
進行上行轉換(把派生類的指針或引用轉換成基類表示)是安全的;
進行下行轉換(把基類指針或引用轉換成派生類表示)時,由于沒有動態類型檢查,所以是不安全的。
②用于基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
③把空指針轉換成目標類型的空指針。
④把任何類型的表達式轉換成void類型。
注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性。
C++中static_cast和reinterpret_cast的區別
C++primer第五章里寫了編譯器隱式執行任何類型轉換都可由static_cast顯示完成; reinterpret_cast通常為操作數的位模式提供較低層的重新解釋
static_cast(靜態轉換):用于明確定義良性和適度良性的轉換,包括原來不需要采用強制轉換的自動類型轉換(包括無損的提升轉換和可能丟失信息的窄化轉換[narrowing conversion],對后者編譯器一般會提出警告)。即將編譯器隱式執行的轉型弄成顯示的。標準C++提倡對任何數據的類型轉換(不論是自動的還是強制的),都采用新的*_cast顯式類型轉換方法。例如:
3、dynamic_cast <type-id> (expression)
將一個基類對象指針(或引用)cast到繼承類指針,dynamic_cast會根據基類指針是否真正指向繼承類指針來做相應處理.
該運算符把expression轉換成type-id類型的對象。Type-id 必須是類的指針、類的引用或者void*; 如果 type-id 是類指針類型,那么expression也必須是一個指針,如果 type-id 是一個引用,那么 expression 也必須是一個引用。 dynamic_cast運算符可以在執行期決定真正的類型。如果 downcast 是安全的(也就說,如果基類指針或者引用確實指向一個派生類對象)這個運算符會傳回適當轉型過的指針。如果 downcast 不安全,這個運算符會傳回空指針(也就是說,基類指針或者引用沒有指向一個派生類對象)。 dynamic_cast主要用于類層次間的上行轉換和下行轉換,還可以用于類之間的交叉轉換。dynamic_cast(動態轉換):一種安全的向下類型轉換(downcast)操作,用于在一個類繼承層次上向下移動。
因為每個派生類的基類都只有一個,而且派生類本身又包含了幾乎所有的基類信息(private型的除外),所以向上的類型轉換(upcast)總是唯一的和比較安全的。而一個基類往往有多個派生類,而且派生類中一般會在基類的基礎上添加了一些特有的數據和操作,所以向下的類型轉換總是多態的和不太安全的。
dynamic_cast提供了一種安全的向下類型轉換操作,只有當類型轉換是正確的并且轉換取的成功,返回值才是所需要的指針;否則它將返回0(空指針NULL),表示不是正確的類型。
例如:
[cpp]?view plain?copy
注意:dynamic_cast雖然安全,但是運行時需要一定開銷,因此不提倡大量使用這種轉換。如果你已經能夠確認轉換的正確性,則可以采用前面介紹過的(無運行時開銷的)static_cast轉換。只有當你實在無法確定轉換是否正確時,才需要采用dynamic_cast轉換。
在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;4、const_cast
const_cast,用于修改類型的const或volatile屬性。
const_cast<type_id> (expression) 該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。 一、常量指針被轉化成非常量的指針,并且仍然指向原來的對象; 二、常量引用被轉換成非常量的引用,并且仍然指向原來的對象;
三、const_cast一般用于修改底指針。如const char *p形式。
const_cast(常量轉換):可將(同數據類型的)常型(const)轉換為非常型、將易變(volatile)型轉換為非易變型。如果用于其他類型的轉換,一般會產生一個編譯錯誤。例如:
-----------------------------------------------------------------------------------------------------------------------------------------------------
在這四種強制轉換中,static_cast最常用(目前還沒有流行起來,但是被標準C++著力提倡)、dynamic_cast最重要、const_cast也有用、而reinterpret_cast則很少被使用。?
總結
以上是生活随笔為你收集整理的c++有哪四个类型转换相关的关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么将导出的sql文件再次导入到数据库?
- 下一篇: QT4到QT5的变化!