static_cast是一個強制類型轉換操做符。強制類型轉換,也稱爲顯式轉換,C++中強制類型轉換操做符有static_cast、dynamic_cast、const_cast、reinterpert_cast四個。本節介紹static_cast操做符。程序員
double a = 1.999; int b = static_cast<double>(a); //至關於a = b ;
當編譯器隱式執行類型轉換時,大多數的編譯器都會給出一個警告:安全
e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: 「初始化」: 從「double」轉換到「int」,可能丟失數據
使用static_cast能夠明確告訴編譯器,這種損失精度的轉換是在知情的狀況下進行的,也能夠讓閱讀程序的其餘程序員明確你轉換的目的而不是因爲疏忽。spa
把精度大的類型轉換爲精度小的類型,static_cast使用位截斷進行處理。指針
double a = 1.999; void * vptr = & a; double * dptr = static_cast<double*>(vptr); cout<<*dptr<<endl;//輸出1.999
static_cast也能夠用在於基類與派生類指針或引用類型之間的轉換。然而它不作運行時的檢查,不如dynamic_cast安全。static_cast僅僅是依靠類型轉換語句中提供的信息來進行轉換,而dynamic_cast則會遍歷整個類繼承體系進行類型檢查,所以dynamic_cast在執行效率上比static_cast要差一些。如今咱們有父類與其派生類以下:code
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(); //正確 //子類指針轉爲派生類指針 DOG *dog2= new DOG; ANIMAL *ani2 = static_cast<DOG*>(dog2); ani2->OutPutname(); //正確,結果輸出爲大黃 // system("pause"); }