講解型別轉化 C

2021-08-30 11:35:14 字數 2537 閱讀 7722

隱式轉化是自動執行的,不需要程式設計師的介入,有時甚至不需要程式設計師了解。

舉個例子:

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 ...