強制類型轉換

強制類型轉換

操作數的類型不同,而且不屬於基本數據類型時,經常需要將操作數轉化為所需要的類型,這個過程即為強制類型轉換。強制類型轉換具有兩種形式:顯式強制轉換和隱式強制類型轉換。

強制類型轉換


1、顯式強制類型轉換

C中顯式強制類型轉換很簡單,格式如下:
TYPE b = (TYPE) a;
其中,TYPE為類型描述符,如int,float等。經強制類型轉換運算符運算后,返回一個具有TYPE類型的數值,這種強制類型轉換操作並不改變操作數本身,運算后操作數本身未改變,例如:
int n=0xab65;
char a=(char)n;
上述強制類型轉換的結果是將整型值0xab65的高端一個位元組刪掉,將低端一個位元組的內容作為char型數值賦值給變數a,而經過類型轉換后n的值並未改變。
C++中強制類型轉換函數有4個:const_cast(用於去除const屬性),static_cast(用於基本類型的強制轉換),dynamic_cast(用於多態類型之間的類型轉換),reinterpreter_cast(用於不同類型之間的指針之間的轉換,最常用的就是不同類型之間函數指針的轉換)。

2、隱式強制類型轉換

隱式類型轉換髮生在賦值表達式和有返回值的函數調用表達式中。在賦值表達式中,如果賦值符左右兩側的操作數類型不同,則將賦值符右邊操作數強制轉換為賦值符左側的類型數值后,賦值給賦值符左側的變數。在函數調用時,如果return後面表達式的類型與函數返回值類型不同,則在返回值時將return後面表達式的數值強制轉換為函數返回值類型后,再將值返回,如:
int n;
double d=3.88;
n=d;//執行本句后,n的值為3,而d的值仍是3.88。

自動類型轉換


在C語言中,自動類型轉換遵循以下規則:
1、若參與運算量的類型不同,則先轉換成同一類型,然後進行運算。
2、轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型后再進行運算。
a、若兩種類型的位元組數不同,轉換成位元組數高的類型
b、若兩種類型的位元組數相同,且一種有符號,一種無符號,則轉換成無符號類型
3、所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再作運算。
4、char型和short型(在visual c++等環境下)參與運算時,必須先轉換成int型。
5、在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分直接捨去。

隱式自動類型轉換


C++語言編譯系統提供的內部數據類型的隱式自動轉換規則如下:
1、執行算術運算時,低類型(短位元組)可以轉換為高類型(長位元組);例如: int型轉換成double型,char型轉換成int型等等;
2、賦值表達式中,等號右邊表達式的值的類型自動隱式地轉換為左邊變數的類型,並賦值給它;
3、函數調用時,將實參的值傳遞給形參,系統首先會自動隱式地把實參的值的類型轉換為形參的類型,然後再賦值給形參;
4、函數有返回值時,系統首先會自動隱式地將返回表達式的值的類型轉換為函數的返回類型,然後再賦值給調用函數返回;

單參構造函數的類型轉換功能


實際應用中,當一個類定義中提供了單個參數的構造函數時,該類便提供了一種將其它數據類型的數值或變數轉換為用戶所定義數據類型的方法;因此,可以說,單個參數的構造函數提供了數據類型轉換的功能。