C 強制型別轉換

2021-08-22 19:04:03 字數 2127 閱讀 1166

c++和c語言存在四種基本型別:整型,浮點型,字元型,布林型。在c語言中,程式裡時常會發生隱式型別轉換和強制型別轉換,但是他們卻沒有明顯的區分,這就會讓我們程式猿耗費多餘的精力去區分它們,因此在c++裡,就新增了static_cast、const_cast、reinterpret_cast、dynamic_cast,explicit四個關鍵字,來讓我們程式猿很好的區分哪兒是隱式型別轉換,哪兒是強制型別轉換。

static_cast主要用於非多型型別的轉換,也就是用於資料型別的轉換,它相當於c語言的隱式型別轉換。

用法:static_cast《型別》(變數或者表示式)

它有如下的用法:

(1)用於類層次結構中基類和派生類之間指標或引用的轉換

進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的

進行下行轉換(把基類的指標或引用轉換為派生類表示),由於沒有動態型別檢查,所以是不安全的

(2)用於基本資料型別之間的轉換,如把int轉換成char。這種轉換的安全也要開發人員來保證

(3)把空指標轉換成目標型別的空指標

(4)把任何型別的表示式轉換為void型別

注意:static_cast不能轉換掉expression的const、volitale或者__unaligned屬性。切記它不能對不相關型別進行轉換。

const_cast最常用的用法就是刪除變數的const屬性,方便賦值。

用法:const_cast《型別》(expression)

它的作用如下:

(1)該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。

(2) 常量指標被轉化成非常量指標,並且仍然指向原來的物件;

(3)常量引用被轉換成非常量引用,並且仍然指向原來的物件;常量物件被轉換成非常量物件。

使用const_cast使程式猿的無奈之舉,因此在日常的c++程式設計中一定不要使用它去修改指標或者引用的常量性並且去修改原始變數的數值,這是一種很爛的行為。

reinterpret_cast將一種型別轉換為另一種型別,這就相當於c語言的強制型別轉換。

用法:reinterpret_cast《型別》(expression)

它的作用有下面幾點:

(1)改變指標和引用的型別

(2)將指標或引用轉換為乙個足夠長的整型

(3)將整型轉換為指標或引用型別

reinterpret的強制型別轉換過程只是位元位的拷貝,因此在使用的是要很謹慎。

說到dynamic_cast就不得不提一下rtti(run_time type identification)執行時型別識別,俗稱型別識別,c++是一種靜態語言,它的資料型別在編譯的時候就已經確定了,但是由於物件導向的多型性要求,c++中的指標或者引用本身的型別,可能和實際型別並不一致,這時候我們程式猿就需要將乙個多型指標或引用轉化為乙個其實際物件的型別,也就是需要知道它執行時的型別,這樣就產生了rtti機制。在c++中使用這個機制的有auto,type_id,decltype,還有就是dynamic_cast。

dynamic_cast用於將父類物件的指標或引用轉換為子類物件的指標或引用(動態轉換)

一般我們進行向上轉換,即子類物件的指標或引用 -> 父類物件的指標或引用,這種情況是不會出現問題的(切片)。

但是我們如果進行向下轉換,將父類物件的指標或引用 -> 子類物件的指標或引用,如果不使用dynamic_cast就會很容易出現問題,就像當我們在使用這個本應該是父類指標的子類指標使用它時,就會因為訪問越界而程式崩潰。

用法:dynamic《型別》(expression)

注意事項:

(1)dynamic_cast只能用於含有虛函式的類

(2)dynamic_cast會先檢查是否可以轉換成功,能轉換成功就進行轉換,不能就返回0.

explicit是c++的乙個關鍵字,它可以阻止進過轉換建構函式進行的隱式轉換的發生。

explicit需要注意一點,在c++類級別的隱式型別轉換中,單引數的建構函式都支援隱式型別轉換(編譯器先建立乙個匿名物件,然後再進行拷貝構造,最後再將其優化為乙個建構函式),如果不允許這種情況的發生,就需要在建構函式之前加上explicit關鍵字。這麼說來所有的智慧型指標都得加explicit,因為不能將任意型別的指標都給智慧型指標來管理。

C 強制型別轉換

四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...

C 強制型別轉換

標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...

C 強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast,dynamic cast,reint...