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