C 中的型別轉換與型別識別 1

2021-04-06 19:58:36 字數 3212 閱讀 7491

c++

基礎內容,

不值一提

author

:jacky wu

2006-4-17

引用該文章,須註明其出處

c++中的型別轉換與型別識別

c++

中型別轉換有很多,從簡單的內部型別的自動轉換到複雜的自定義類的型別轉換,以及多型方式的「型別轉換」越來越複雜,讓我等小輩看的是眼花繚亂,不得已,花點時間理清思路,以後用起來也方便一些。

很多書中對於型別轉換都有分散介紹,大概在類繼承,多型,以及執行時刻型別識別(

rtti

)這些章節有敘述,我對此理解也並不是很透,只能試驗幾個**,理清一些思路,當然會有理解錯誤的地方,還望各路高手多做指點,我在這先謝了。

1

:內部型別轉換

內部型別的轉換很好理解,一般都會碰到。從

char -> int -> float ->double

等等,在這種情況下,如果是從位元組數小的型別轉換到大的型別一般不會出現錯誤

(如int ->float

),但是反過來就會有問題了(

float - > int

)這會丟失一些資料得到部準確的結果,編譯器也會在這種情況下發出警告。當然,可以用強制型別轉換來肯定我們的操作:

int

i = 100;

float

x= 2.0;

x = i;

//ok,

預設轉換沒有問題

i = x;

//可以這樣做,但會引起警告

i =(

int) x;

//ok,

正確的操作

/* 對於這樣的強制轉換,可以有很多種方式,主要是同根型別之間的轉換 *

有內部型別到內部型別,指標到指標,引用到引用 *

使用時當然要注意轉換後資料的正確性 */

還有進行運算時的隱式轉換,方式同上面一樣,主要式型別提公升轉換,這很簡單的說j

2

:自定義型別的自動型別轉換,有兩種方式

a. 利用建構函式自動轉換

b. 利用自定義

operator ??

定義轉換型別

a. 利用建構函式自動轉換

這種方法是通過建構函式把另外乙個型別的物件或者引用作為引數,通過這樣的方式來實現引數型別到構造型別之間的轉換(好像沒有表達清楚),咱們看**:

class

ac };

class

bc };

void

fun( bc )

int

main()

輸出結果

invoke bc( const ac& a )

invoke fun(bc)

顯然,在呼叫

fun(aclass);

的時候,自動通過呼叫

bc的建構函式生成了

bc物件,這樣就可以正確使用這個函式,但是如果引數是通過引用傳遞的:

void

fun( bc& )

,上訴做法就會出現錯誤。如果想避免出現這樣的隱式呼叫,則使用

explicit

關鍵字:

class

bc };

這樣,上述的隱式轉換就不會成功。

b.

利用自定義

operator

classname

定義轉換型別

通過operator

關鍵字建立乙個成員函式,關鍵字後面跟上想要轉換的目的型別,這樣就可以實現將當前型別轉換到目的型別:

class

three

private:

intsize;

};

class

four

operator

three()

const

private:

intsize;

};

void

fun( three )

int

main()

輸出結果:

invoke four(int sz )

invoke four::operator three()

invoke three(int sz = 0)

invoke fun(three)

invoke three(int sz = 0)

invoke fun(three)

顯然通過自定義的

operator three

()實現了由

three

到four

之間的轉換。

自動型別轉換的問題:

自動型別轉換由於是由編譯器隱式呼叫的,有很多細節我們不是很清楚,在使用這個功能的時候要格外小心,下面兩種情況會出現問題:(

copy from thinking in c++

) class

orange

;

//class declaration

class

public:

operator

orange()

const

{}//

自定義轉換 };

class

orange

;

void

fun(

orange

) {}

int

main()

還有,當類自定義了到多個型別的轉換時,就不能進行下面的過載:

class

orange

{};

//class declaration

class

pear {};

class

public:

operator

orange()

const

{}//

自定義轉換

operator

pear()

const;

//過載

fun void

fun(

orange

) {}

void

fun(pear) {}

int

main()

很明顯,自動型別轉換不是太好用的東東,我們必須在確定需要它的時候在使用它,而且必須確保無誤,否則會很難除錯,待續...

c 型別識別及轉換

1.概念 rtti run time type information 即執行時型別識別,c 通過rtti實現對多型的支援。c 是靜態型別語言,其資料型別是在編譯期就確定的,不能在執行時更改。為了支援rtti,c 提供了乙個type info類和兩個關鍵字typeid和dynamic cast。ty...

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...

C 中型別轉換

c 中有三種方式進行型別轉換。1 隱式轉換 隱式轉換包括隱式數值轉換 隱式列舉轉換 隱式引用轉換。隱式數值轉換如下 轉換型別 安全轉換到的型別 byte short ushort int uint long ulong float double decimal sbyte short int lon...