【转】C++标准转换运算符static_cast
static_cast<new_type> (expression)
雖然const_cast是用來去除變量的const限定,但是static_cast卻不是用來去除變量的static引用。其實(shí)這是很容易理解的,static決定的是一個(gè)變量的作用域和生命周期,比如:在一個(gè)文件中將變量定義為static,則說明這個(gè)變量只能在本Package中使用;在方法中定義一個(gè)static變量,該變量在程序開始存在直到程序結(jié)束;類中定義一個(gè)static成員,該成員隨類的第一個(gè)對(duì)象出現(xiàn)時(shí)出現(xiàn),并且可以被該類的所有對(duì)象所使用。
對(duì)static限定的改變必然會(huì)造成范圍性的影響,而const限定的只是變量或?qū)ο笞陨怼5珶o(wú)論是哪一個(gè)限定,它們都是在變量一出生(完成編譯的時(shí)候)就決定了變量的特性,所以實(shí)際上都是不容許改變的。這點(diǎn)在const_cast那部分就已經(jīng)體現(xiàn)出來。
static_cast和reinterpret_cast一樣,在面對(duì)const的時(shí)候都無(wú)能為力:兩者都不能去除const限定。兩者也存在很多的不同,比如static_cast不僅可以用在指針和引用上,還可以用在基礎(chǔ)數(shù)據(jù)和對(duì)象上;reinterpret_cast可以用在"沒有關(guān)系"的類型之間,而用static_cast來處理的轉(zhuǎn)換就需要兩者具有"一定的關(guān)系"了。
常用場(chǎng)合
1、編譯器隱式執(zhí)行的任何類型轉(zhuǎn)換都可以由static_cast來完成,比如int與float、double與char、enum與int之間的轉(zhuǎn)換等。
double a = 1.999; int b = static_cast<int>(a); //相當(dāng)于b = a ;當(dāng)編譯器隱式執(zhí)行類型轉(zhuǎn)換時(shí),大多數(shù)的編譯器都會(huì)給出一個(gè)警告:
e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: “初始化”: 從“double”轉(zhuǎn)換到“int”,可能丟失數(shù)據(jù)使用static_cast可以明確告訴編譯器,這種損失精度的轉(zhuǎn)換是在知情的情況下進(jìn)行的,也可以讓閱讀程序的其它程序員明確你是有意識(shí)的轉(zhuǎn)換而不是由于疏忽。
把精度大的類型轉(zhuǎn)換為精度小的類型,static使用位截?cái)噙M(jìn)行處理。
2、使用static_cast可以找回存放在void*指針中的值。
double a = 1.999; void * vptr = & a; double * dptr = static_cast<double*>(vptr); cout<<*dptr<<endl;//輸出1.9993、static_cast也可以用在基類與派生類指針或引用類型之間的轉(zhuǎn)換。然而它不做運(yùn)行時(shí)的檢查,不如dynamic_cast安全。static_cast僅僅是依靠類型轉(zhuǎn)換語(yǔ)句中提供的信息來進(jìn)行轉(zhuǎn)換,而dynamic_cast則會(huì)遍歷整個(gè)類繼承體系進(jìn)行類型檢查,因此dynamic_cast在執(zhí)行效率上會(huì)比static_cast要差一些。
現(xiàn)在我們有父類與其派生類如下:
class ANIMAL { public:ANIMAL():_type("ANIMAL"){};virtual void OutPutname(){cout<<"ANIMAL";}; private:string _type ; }; class DOG:public ANIMAL { public:DOG():_name("大黃"),_type("DOG"){};void OutPutname(){cout<<_name;};void OutPuttype(){cout<<_type;}; private:string _name ;string _type ; };此時(shí)我們進(jìn)行派生類與基類類型指針的轉(zhuǎn)換:注意從下向上(子類到基類)的轉(zhuǎn)換是安全的,從上向下(基類到子類)的轉(zhuǎn)換不一定安全。
int main() {//基類指針轉(zhuǎn)為派生類指針,且該基類指針指向基類對(duì)象。ANIMAL * ani1 = new ANIMAL ;DOG * dog1 = static_cast<DOG*>(ani1);//dog1->OutPuttype();//錯(cuò)誤,在ANIMAL類型指針不能調(diào)用方法OutPutType();在運(yùn)行時(shí)出現(xiàn)錯(cuò)誤。//基類指針轉(zhuǎn)為派生類指針,且該基類指針指向派生類對(duì)象ANIMAL * ani3 = new DOG;DOG* dog3 = static_cast<DOG*>(ani3);dog3->OutPutname(); //正確// system("pause");}?
從上邊對(duì)static_cast分析可以看出,static_cast跟傳統(tǒng)轉(zhuǎn)換方式幾乎是一致的,所以只要將static_cast和圓括號(hào)去掉,再將尖括號(hào)改成圓括號(hào)就變成了傳統(tǒng)的顯式轉(zhuǎn)換方式。
?
轉(zhuǎn)自:
http://www.cnblogs.com/ider/archive/2011/07/31/cpp_cast_operator_part4.html
http://www.cnblogs.com/QG-whz/p/4509710.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【转】C++标准转换运算符static_cast的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ihtml2document能不能根据i
- 下一篇: 轻量级锁_并发编程实战05:锁的状态