在我們學習c語言的時候,就知道強制型別轉換和隱式型別的轉換,但是在型別轉換的過程中,很有可能乙個不注意,容易出問題,這無疑是加大了,程式設計師的工作量,而且還檢查很不好檢查。
所以在c++ 中就對型別的轉換做了一定的限制,但是實際中大多數人,是在學習了c 語言後才學習 c++ 語言所以就用了 c 語言中的型別轉換方式,那麼今天我們介紹一下 c++ 中型別轉換的方式,他們都是通過類模板的方式實現
在 c 語言中強轉是可以把乙個不想關的型別都可以強轉,但是這樣就很容易出問題,如果我們用了const_cast 如果要把兩個兩個不相關的型別的const轉到非const是不行的。這樣就限制了出錯的概率,,增強了**的可讀性,但是實際中,大多數還是喜歡採用c語言,但是我們必須得知道。
const
int i = 10;//在c++中這樣編譯器會優化為暫存器變數用volatile
int* j = const_cast
(&i); // const 與非 const 轉換
什麼是隱式型別的轉換,隱式型別轉換,就像c語言中我們可以把乙個整型 int 賦值給乙個 float 這就是隱式型別的轉換。
我們簡單的寫乙個例子
void test()
這樣寫增強了**的可讀性
這強制型別轉換是就像 c語言中的強轉。
我們舉乙個例子:
typedef
void (* func)();
int dosomething (int i)
void test ()
這樣我們就把乙個函式賦值,還可以呼叫。
dynamic_cast用於將乙個父類物件的指標轉換為子類物件的指標或引用(動態
轉換)
向上轉型:子類物件指標->父類指標/引用(不需要轉換)
向下轉型:父類物件指標->子類指標/引用(用dynamic_cast轉型是安全的)
這裡用這種強轉必須要虛函式的類,用dynamic_cast來轉換父類付給子類的時候,有時候可以,有時候不行,這樣用dynamic_cast 強轉就會在轉變的過程中去判斷,如果可以把父類給子類就強轉,如果不行就返回0.
紅色標記的是強轉失敗,因為把父類賦給子類失敗。強轉就會判斷是否成功。
如果用c語言中強轉可以成功,但是如果強轉後,去訪問有可能會訪問越界。
在強轉中,對於單引數的建構函式,支援隱式型別的轉換,所以當我們不需要隱式型別的轉換的時候,我們就可以加上explicit關鍵字來防止,在建構函式的時候發生隱式型別的轉換。
單引數的類建構函式的隱式型別轉換。
class a
;int main ()
我們加上關鍵字後,用 = 來進行隱式型別轉換,是編譯不能通過的。
如果我們不加就可以通過。
C強制型別轉換與隱式轉換
如果乙個運算子兩邊的運算數型別不同,先要將其轉換為相同的型別,即較低型別轉換為較高型別,然後再參加運算,轉換規則如下圖所示 圖中橫向箭頭表示必須的轉換,如兩個float型數參加運算,雖然它們型別相同,但仍要先轉成double型再進行運算,結果亦為double型。縱向箭頭表示當運算子兩邊的運算數為不同...
js強制轉換和隱式轉換
一 強制轉換 使用string number boolean 函式強制轉換 var str 100 var str1 100 console.log typeof str number console.log typeof str1 string console.log typeof string ...
C 類型別隱式轉換
隱式類型別轉換 可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。c primer 首先要單個實參,你可以把建構函式colour的預設實參去掉,也就是定義乙個物件必須要兩個引數的時候,檔案編譯不能通過。以上只是將內建型別轉換為自定義型別 過載double,int 將使用者自定義資...