static_cast<new_type> (expression)
雖然const_cast是用來去除變量的const限定,但是static_cast卻不是用來去除變量的static引用。其實這是很容易理解的,static決定的是一個變量的作用域和生命周期,比如:在一個文件中將變量定義為static,則說明這個變量只能在本Package中使用;在方法中定義一個static變量,該變量在程序開始存在直到程序結束;類中定義一個static成員,該成員隨類的第一個對象出現時出現,并且可以被該類的所有對象所使用。
對static限定的改變必然會造成范圍性的影響,而const限定的只是變量或對象自身。但無論是哪一個限定,它們都是在變量一出生(完成編譯的時候)就決定了變量的特性,所以實際上都是不容許改變的。這點在const_cast那部分就已經體現出來。
static_cast和reinterpret_cast一樣,在面對const的時候都無能為力:兩者都不能去除const限定。兩者也存在很多的不同,比如static_cast不僅可以用在指針和引用上,還可以用在基礎數據和對象上;reinterpret_cast可以用在"沒有關系"的類型之間,而用static_cast來處理的轉換就需要兩者具有"一定的關系"了。
常用場合
1、編譯器隱式執行的任何類型轉換都可以由static_cast來完成,比如int與float、double與char、enum與int之間的轉換等。
double a = 1.999; int b = static_cast<int>(a); //相當于b = a ;
當編譯器隱式執行類型轉換時,大多數的編譯器都會給出一個警告:
e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: “初始化”: 從“double”轉換到“int”,可能丟失數據
使用static_cast可以明確告訴編譯器,這種損失精度的轉換是在知情的情況下進行的,也可以讓閱讀程序的其它程序員明確你是有意識的轉換而不是由于疏忽。
把精度大的類型轉換為精度小的類型,static使用位截斷進行處理。
2、使用static_cast可以找回存放在void*指針中的值。
double a = 1.999; void * vptr = & a; double * dptr = static_cast<double*>(vptr); cout<<*dptr<<endl;//輸出1.999
3、static_cast也可以用在基類與派生類指針或引用類型之間的轉換。然而它不做運行時的檢查,不如dynamic_cast安全。static_cast僅僅是依靠類型轉換語句中提供的信息來進行轉換,而dynamic_cast則會遍歷整個類繼承體系進行類型檢查,因此dynamic_cast在執行效率上會比static_cast要差一些。
現在我們有父類與其派生類如下:
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 ; };
此時我們進行派生類與基類類型指針的轉換:注意從下向上(子類到基類)的轉換是安全的,從上向下(基類到子類)的轉換不一定安全。
int main() {//基類指針轉為派生類指針,且該基類指針指向基類對象。ANIMAL * ani1 = new ANIMAL ;DOG * dog1 = static_cast<DOG*>(ani1);//dog1->OutPuttype();//錯誤,在ANIMAL類型指針不能調用方法OutPutType();在運行時出現錯誤。//基類指針轉為派生類指針,且該基類指針指向派生類對象ANIMAL * ani3 = new DOG;DOG* dog3 = static_cast<DOG*>(ani3);dog3->OutPutname(); //正確// system("pause");}
?
從上邊對static_cast分析可以看出,static_cast跟傳統轉換方式幾乎是一致的,所以只要將static_cast和圓括號去掉,再將尖括號改成圓括號就變成了傳統的顯式轉換方式。
?
轉自:
http://www.cnblogs.com/ider/archive/2011/07/31/cpp_cast_operator_part4.html
http://www.cnblogs.com/QG-whz/p/4509710.html