************ 一、隱式類型轉(zhuǎn)換 ************* C++語言為內(nèi)置類型定義了一套隱式類型轉(zhuǎn)換。隱式類型轉(zhuǎn)換有如下情形: 1、在混合類型的算術(shù)表達(dá)式中,所有類型會(huì)向最寬的類型轉(zhuǎn)換。這被稱為算術(shù)類型轉(zhuǎn)換。 算數(shù)轉(zhuǎn)換包括兩種形式: a、如果可能,所有類型都將提升為最寬的類型已避免數(shù)據(jù)損失; b、只要表達(dá)式中包含的都是整數(shù)類型,則均先提升小于int的整型為int再進(jìn)行其他轉(zhuǎn)換或計(jì)算; 2、在賦值表達(dá)式中,被賦值的類型(‘=’左邊的操作數(shù))將作為目標(biāo)轉(zhuǎn)換類型。 這時(shí)候由于目標(biāo)轉(zhuǎn)換類型不一定是整個(gè)表達(dá)式中最寬的數(shù)據(jù)類型,因此可能會(huì)產(chǎn)生數(shù)據(jù)損失,因此一般編譯器會(huì)給出個(gè)warning。 賦值表達(dá)式有多種表現(xiàn)形式,如下: a、直接的’=‘賦值語句; b、將表達(dá)式作為參數(shù)傳遞給函數(shù)時(shí),這時(shí)候函數(shù)的形參可以看作‘=’左邊的操作數(shù),實(shí)際參數(shù)作為‘=‘右邊的操作數(shù) c、函數(shù)體return語句將表達(dá)式返回式,這時(shí)候函數(shù)名作為’=‘左邊的操作數(shù),返回的表達(dá)式為右邊的操作數(shù)。 3、類型大小關(guān)系: unsigned > signed; long double > double > float > integral types; unsigned long > long / int > bool,unsigned char, signed char,char,w_char, short int; 注:unsigned short int與int的大小關(guān)系與機(jī)器有關(guān), unsigned int與long的大小關(guān)系與機(jī)器有關(guān); 當(dāng)int不足以代表所有unsigned short int值時(shí),兩者均轉(zhuǎn)化為unsigned int;當(dāng)long不足以代表所有unsigned int值時(shí),兩者均轉(zhuǎn)換為unsigned long。 枚舉類型用能代表所有枚舉值的最小的整型類型存儲(chǔ)。 ************ 二、顯式類型轉(zhuǎn)換 ************* 語法:const_name<type>(expr); 1、const_cast 去除表達(dá)式的const/volatile屬性。一般用于去除指針的const屬性。 例如: const int a = 5; const int * ptr = &a; int * ptr1 = const_cast<int *>(ptr); // okay!! *ptr1 = 8; cout << *ptr1 << endl; cout << *ptr << endl; int b = const_cast<int>(a); //error C2440: 'const_cast' : cannot convert from 'const int' to 'int' cout << b << endl; } 2、static_cast 標(biāo)準(zhǔn)轉(zhuǎn)換基本上都可以用static_cast來實(shí)現(xiàn)。具體有如下用法: a、將編譯器執(zhí)行的隱式轉(zhuǎn)換顯示化; b、或?qū)oid*轉(zhuǎn)換為顯式類型的指針; c、將算術(shù)值轉(zhuǎn)換為枚舉值; d、將基類(或基類指針/引用)轉(zhuǎn)化為派生類(或派生類指針/引用) 其中,b、c、d存在潛在的危險(xiǎn);a存在潛在的數(shù)據(jù)損失。 3、reinterpret_cast 對(duì)操作數(shù)進(jìn)行低級(jí)別的bit模式的重翻譯,其正確性完全由編程者掌控,編譯器不負(fù)任何責(zé)任。 推薦使用reinterpret_cast來實(shí)現(xiàn)所有指針的顯示轉(zhuǎn)換操作。 4、舊風(fēng)格的顯示轉(zhuǎn)換語法: a、C++函數(shù)風(fēng)格:type_name(expr) b、C語言風(fēng)格:(type_name)expr 舊的顯示轉(zhuǎn)換風(fēng)格,可以實(shí)現(xiàn)所有上述三種顯示轉(zhuǎn)換方式的功能。但由于其潛在的危險(xiǎn)更難于跟蹤,因此不推薦使用。 5、dynamic_cast ************************ 三、自定義類型轉(zhuǎn)換 ************************** 自定義的類型轉(zhuǎn)換有兩種,一種是通過"類型轉(zhuǎn)換函數(shù)" (hi.baidu.com/cosmicocean/blog/item/4b5e47af46f678fdfaed5038.html) 另一種是通過" 單參數(shù)的構(gòu)造函數(shù)" 。 實(shí)際程序中,用戶可以顯示的指明某一個(gè)轉(zhuǎn)換所采用的類型轉(zhuǎn)換方式,若編譯器允許這種轉(zhuǎn)換(內(nèi)置允許或用戶自定義了該轉(zhuǎn)換方式),則進(jìn)行轉(zhuǎn)換操作。用戶沒有顯示指明時(shí),編譯器將根據(jù)的情況選擇是否能進(jìn)行隱式轉(zhuǎn)換。下面闡述隱式轉(zhuǎn)換相關(guān)的內(nèi)容: 實(shí)際程序中,原類型需要轉(zhuǎn)換為目標(biāo)類型時(shí),若有內(nèi)置轉(zhuǎn)換(lval->rval / promotion / standard conversion)則直接轉(zhuǎn)換;否則,若類型轉(zhuǎn)換函數(shù)轉(zhuǎn)換的類型就是目標(biāo)類型,則編譯器會(huì)隱式的調(diào)用該函數(shù)進(jìn)行轉(zhuǎn)換;否則,編譯器將結(jié)合用戶自定義轉(zhuǎn)換與標(biāo)準(zhǔn)轉(zhuǎn)換序列,以達(dá)到目標(biāo)類型。 最后一種情況實(shí)際上是如下形式的轉(zhuǎn)換序列: Standard Conversion Sequence ->User-defined Conversion ->Standard Conversion Sequence (注意,序列中只能包含一個(gè)用戶自定義的轉(zhuǎn)換) 有時(shí)候,可以有不同的轉(zhuǎn)換序列能實(shí)現(xiàn)原類型到目標(biāo)類型的轉(zhuǎn)換,編譯器需要挑選出最好的一個(gè)序列進(jìn)行隱式類型轉(zhuǎn)換。 1、類型轉(zhuǎn)換函數(shù) 含有類型轉(zhuǎn)換函數(shù)的轉(zhuǎn)換序列為:User-defined Conversion->Standard Conversion Sequence。 2、構(gòu)造函數(shù) 含有構(gòu)造函數(shù)的轉(zhuǎn)換序列為:Standard Conversion Sequence->User-defined Conversion. 3、最佳選擇 不論含有上述哪種用戶自定義的轉(zhuǎn)換,若有多個(gè)序列可以完成轉(zhuǎn)換,標(biāo)準(zhǔn)轉(zhuǎn)換序列的等級(jí)將決定選擇那種轉(zhuǎn)換;若幾個(gè)序列優(yōu)先級(jí)相同,則該轉(zhuǎn)換為ambiguous,編譯器無法完成轉(zhuǎn)換。 |
聯(lián)系客服