C 中的型別轉換

2022-08-31 01:30:18 字數 2701 閱讀 5379

在c++語言中,型別轉換分位兩種:隱式型別轉換 和 顯式型別轉換。

1. 隱式型別轉換

隱式轉換就是系統預設的、不需要加以宣告就可以進行的轉換。一般情況下,資料型別的轉換通常是由編譯系統自動進行的,不需要人工干預,所以被稱為隱式型別轉換。

在以下四種情況下會進行隱式轉換:

1:算術表示式中,低型別能夠轉換為高型別。

2:賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別;

3:函式呼叫中引數傳遞時,系統隱式地將實參轉換為形參的型別後,賦給形參。

4:函式有返回值時,系統將隱式地將返回表示式型別轉換為返回值型別,賦值給呼叫函式。

int    itmp = 0

;double dtmp = 10

;dtmp = itmp; //

itmp被隱式轉換為double

if(itmp); //

itmp被隱式轉換為bool

itmp + dtmp;//

計算結果被隱式轉換為double

2. 顯示型別轉換

2.1舊式型別轉換

舊式型別轉換其實就是c風格轉換,是從c語言中繼承下來的,比如,為了轉換乙個型別為doubole的浮點數到整型:

int

i;double

d;i = (int

)d;或

inti;

double

d;i = int(d);

2.2 c++新式型別轉換

上面兩種方式不適用於c++中類(class)和類的指標,最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c++的型別轉換符:static_cast, dynamic_cast。標準c++中有四個新式型別轉換符:static_cast、dynamic_cast、reinterpret_cast、和 const_cast。

dynamic_cast

dynamic_cast主要用於於物件的指標和引用。

當用於多型型別時, 其將基類型別物件的引用或指標轉換為同一繼承層次中其他型別的引用和指標。

dynamic_cast的轉換格式:dynamic_cast< type> ( expression )

該運算子把expression轉換成type型別的物件。type必須是類的指標、類的引用或者void*;如果type是類指標型別,那麼expression也必須是乙個指標,如果type是乙個引用,那麼expression也必須是乙個引用。

如果expression是type的基類,使用dynamic_cast進行轉換時,在執行時就會檢查expression是否真正的指向乙個type型別的物件,如果是,則能進行正確的轉換,獲得對應的值;否則返回null,如果是引用,則在執行時就會丟擲異常。例如:

class

a ;

};

class b : public

a ;

};

void

main()

static_cast

static_cast的轉換格式:static_cast< type > ( expression )

該運算子把expression轉換為type型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法:

①用於類層次結構中基類和子類之間指標或引用的轉換。

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

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

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

③把空指標轉換成目標型別的空指標。

④把任何型別的表示式轉換成void型別。

注意:static_cast不能轉換掉expression的const、volitale、或者__unaligned屬性。

reinpreter_cast

reinpreter_cast的轉換格式reinpreter_cast(expression)    

reinterpret_cast 是一種高度危險的轉換,這種轉換僅僅是對二進位制位的重新解釋。這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。例:

class

a{};

class

b{};

a* a = new

a;b* b = reinpreter_casta;

const_cast

const_cast的轉換格式:const_cast(expression)

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

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

#include using

namespace

std;

class

ca

intm_ia;

};

intmain()

C 中的型別轉換

和goto語句一樣型別轉換的名聲似乎也是不那麼好。不過型別轉換在某些緊要關頭就顯得尤為重要,看看現有的c c 就知道,以至於你不理解轉換的作用,將是無法閱讀的。就像鈾,它能變成原子彈,但它也能用來發電,是災難還是福祉那就要看人類了。顯然型別轉換默默承受著這不公的一切。不管怎麼說c風格的型別轉換還是不...

C 中的型別轉換

1.隱式轉換 1 賦值轉換 將右值轉換為左型別,然後再賦值。2 整型提公升 c 將bool char,unsigned char,singned char,short轉換為int,int計算最快 表示式中的優先順序轉換 long double double float unsigned long 對...

C 中的型別轉換

我們知道 變數的型別定義了物件能包含的資料和參與的運算。其中一種運算被大多數型別支援,就是將變數從某一種給定的型別轉化為另外的型別。在了解型別轉換種類之前,首先牢記 型別轉換只是暫時的,原來的變數型別並不改變。在c語言中,分為兩種型別轉換 1,隱式型別轉換 2,顯示型別轉換 例如 double d ...