隱式轉化是自動執行的,不需要程式設計師的介入,有時甚至不需要程式設計師了解。
舉個例子:
int ival =
3.555
+3;
加法的兩個運算物件的型別不同,3.555為double型別,而3是int型,c++不會將兩個不同型別的值直接想加,而是根據型別轉換規則將兩個型別統一之後再求值,在這個例子中,3被提公升為double型,然後兩個double型想加,最後再轉化為int型。
何時發生型別轉換
算術轉換的含義是把一種算術型別轉換為另一種算術型別,算術轉換定義了一套型別轉換的層次。
型別提公升
型別提公升負責把小整數型別轉換為較大的整數型別,對於bool、char、signed char、unsigned char、short以及unsigned short型別來說,只要它們存在int裡,他們就會提公升為int型,就如我們所知的false提公升為0,true提公升為1。
另外如果想深入了解算術轉換,只需要在敲一下測試**然後在編譯器裡觀察一下就好。
除了算術型別轉換之外,還有幾種隱式轉換,包括如下。
陣列轉換為指標
大多數用到陣列的表示式中,陣列自動轉換為指向陣列首元素的指標。
int a[10]
;int
*ptr = a;
//a自動轉換為指向陣列首元素的指標
指標的轉換
c++規定了幾種其他的指標轉換方式,包括常量整數值0或者字面值nullptr能轉換為任意指標型別,指向任意非常量的指標能轉換成void*;指向任意物件的指標能轉換為const void*。
轉換為布林型別
存在一種從算術型別或指標型別轉換成布林型別的自動轉換機制,如果指標或者算術型別的值為0,轉換為false,否則轉換為true,所以我們會看到如下表示式合法:
if
(ptr)
//這裡ptr為乙個指標,ptr轉換為bool型別
if(m)
//這裡m為int型別,轉換為bool型別
非常量轉換為常量
允許將乙個指向非常量的指標轉換為指向相應的常量指標,對於引用也是如此,不過,值得注意的是,反過來非法。
命名的強制型別轉換
主要分為4種,分別是static_cast,dynamic_cast,const_cast,reinterpret_cast,以下做詳細講解。
double d =
static_cast
<
double
>
(j)/ i;
當需要把乙個較大的算數型別賦值給乙個較小的型別時,static_cast就非常有用,相當於告訴編譯器我們不在乎精度的損失。
另外,static_cast對於編譯器無法執行的型別轉換也會非常有用,例如沒我們可以用static_cast找回存在於void*的指標中的值:
void
* p =
&d;double
*dp =
static_cast
<
double
*>
(p);
dynamic_cast
>
(e)dynamic_cast
>
(e)dynamic_cast
>
(e)
type必須是乙個類型別,並且通常情況下該類應該有虛函式,第一種情況下e必須是乙個有效的指標,第二種情況下,e為乙個左值,第三種情況下,e不能是左值。
另外,e還有別的要求,e必須滿足以下三點的其中一點,否則,轉換失敗
e的型別為type的公有派生類
e的型別為目標type的公有基類
e的型別就是目標type的型別
舉個例子,指標型別的dynamic_cast
假定base類至少有乙個虛函式,derived是base的公有派生類,如果有乙個指向base的指標bp,則我們可以在執行時將它轉換成轉換為指向derived的指標,**如下
if
(derived *dp =
dynamic_cast
>
(bp)
)else
轉換成功則可以使用dp指向derived物件,否則要使用bp。
舊式的強制型別轉換
早期的c++包含以下兩種形式:
type
(expr)
;//函式形式的強制型別轉換
(type)expr;
//c風格的強制型別轉換,這種見的比較多
舉個例子
char *p = (char*) ip; //ip為指向int型的指標。
C 型別轉化
c 型別轉化 在理解c 型別轉換前,我們先回顧c語言中型別轉換。c風格的強制型別轉化很簡單,不管什麼型別轉換統統是 type b type a。但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間轉換,比如你可以把乙個指向const物件的指標轉換成指向非con...
c 型別轉化
資料型別轉換 隱式轉換 int age 10 double sum age int salary 150000 decimal money salary double speed 10.4f float minspeed float speed string num 123 int n int.pa...
C 型別轉化
const char a 必須const 因為 hello 存在常量區,為唯讀 string str hello str 1 s pass a str.c str a 1 s fail 報錯 唯讀,指標指向常量區char a a 11 int b atoi a cout string str to ...