語(yǔ)法: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來(lái)實(shí)現(xiàn)。具體有如下用法:
a、將編譯器執(zhí)行的隱式轉(zhuǎn)換顯示化;
b、或?qū)oid*轉(zhuǎn)換為顯式類(lèi)型的指針;
c、將算術(shù)值轉(zhuǎn)換為枚舉值;
d、將基類(lèi)(或基類(lèi)指針/引用)轉(zhuǎn)化為派生類(lèi)(或派生類(lèi)指針/引用)
其中,b、c、d存在潛在的危險(xiǎn);a存在潛在的數(shù)據(jù)損失。
3、reinterpret_cast
對(duì)操作數(shù)進(jìn)行低級(jí)別的bit模式的重翻譯,其正確性完全由編程者掌控,編譯器不負(fù)任何責(zé)任。
推薦使用reinterpret_cast來(lái)實(shí)現(xiàn)所有指針的顯示轉(zhuǎn)換操作。
4、舊風(fēng)格的顯示轉(zhuǎn)換語(yǔ)法:
a、C++函數(shù)風(fēng)格:type_name(expr)
b、C語(yǔ)言風(fēng)格:(type_name)expr
舊的顯示轉(zhuǎn)換風(fēng)格,可以實(shí)現(xiàn)所有上述三種顯示轉(zhuǎn)換方式的功能。但由于其潛在的危險(xiǎn)更難于跟蹤,因此不推薦使用。
5、dynamic_cast
************************ 三、自定義類(lèi)型轉(zhuǎn)換 **************************
自定義的類(lèi)型轉(zhuǎn)換有兩種,一種是通過(guò)"類(lèi)型轉(zhuǎn)換函數(shù)" (
hi.baidu.com/cosmicocean/blog/item/4b5e47af46f678fdfaed5038.html)
另一種是通過(guò)" 單參數(shù)的構(gòu)造函數(shù)" 。
實(shí)際程序中,用戶(hù)可以顯示的指明某一個(gè)轉(zhuǎn)換所采用的類(lèi)型轉(zhuǎn)換方式,若編譯器允許這種轉(zhuǎn)換(內(nèi)置允許或用戶(hù)自定義了該轉(zhuǎn)換方式),則進(jìn)行轉(zhuǎn)換操作。用戶(hù)沒(méi)有顯示指明時(shí),編譯器將根據(jù)的情況選擇是否能進(jìn)行隱式轉(zhuǎn)換。下面闡述隱式轉(zhuǎn)換相關(guān)的內(nèi)容:
實(shí)際程序中,原類(lèi)型需要轉(zhuǎn)換為目標(biāo)類(lèi)型時(shí),
若有內(nèi)置轉(zhuǎn)換(lval->rval / promotion / standard conversion)則直接轉(zhuǎn)換;
否則,若類(lèi)型轉(zhuǎn)換函數(shù)轉(zhuǎn)換的類(lèi)型就是目標(biāo)類(lèi)型,則編譯器會(huì)隱式的調(diào)用該函數(shù)進(jìn)行轉(zhuǎn)換;
否則,編譯器將結(jié)合用戶(hù)自定義轉(zhuǎn)換與標(biāo)準(zhǔn)轉(zhuǎn)換序列,以達(dá)到目標(biāo)類(lèi)型。
最后一種情況實(shí)際上是如下形式的轉(zhuǎn)換序列:
Standard Conversion Sequence ->User-defined Conversion ->Standard Conversion Sequence
(注意,
序列中只能包含一個(gè)用戶(hù)自定義的轉(zhuǎn)換)
有時(shí)候,可以有不同的轉(zhuǎn)換序列能實(shí)現(xiàn)原類(lèi)型到目標(biāo)類(lèi)型的轉(zhuǎn)換,編譯器需要挑選出最好的一個(gè)序列進(jìn)行隱式類(lèi)型轉(zhuǎn)換。
1、類(lèi)型轉(zhuǎn)換函數(shù)
含有類(lèi)型轉(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、最佳選擇
不論含有上述哪種用戶(hù)自定義的轉(zhuǎn)換,若有多個(gè)序列可以完成轉(zhuǎn)換,標(biāo)準(zhǔn)轉(zhuǎn)換序列的等級(jí)將決定選擇那種轉(zhuǎn)換;若幾個(gè)序列優(yōu)先級(jí)相同,則該轉(zhuǎn)換為ambiguous,編譯器無(wú)法完成轉(zhuǎn)換。