static_cast 與 dynamic_cast 的區別

強制類型轉換運算符:C++有四種強制類型轉換符,分別是dynamic_cast,const_cast,static_cast,reinterpret_cast。其中dynamic_cast與運行時類型轉換密切相關,在這裏我們先介紹dynamic_cast,其他三種在後面介紹。  
6.1、dynamic_cast強制轉換運算符:該轉換符用於將一個指向派生類的基類指針或引用轉換爲派生類的指針或引用,注意dynamic_cast轉換符只能用於含有虛函數的類,其表達式爲dynamic_cast<類型>(表達式),其中的類型是指把表達式要轉換成的目標類型,比如含有虛函數的基類B和從基類B派生出的派生類D,則B *pb; D *pd, md;  pb=&md; pd=dynamic<D*>(pb); 最後一條語句表示把指向派生類D的基類指針pb轉換爲派生類D的指針,然後將這個指針賦給派生類D的指針pd,有人可能會覺得這樣做沒有意義,既然指針pd要指向派生類爲什麼不pd=&md;這樣做更直接呢?有些時候我們需要強制轉換,比如如果指向派生類的基類指針B想訪問派生類D中的除虛函數之外的成員時就需要把該指針轉換爲指向派生類D的指針,以達到訪問派生類D中特有的成員的目的,比如派生類D中含有特有的成員函數g(),這時可以這樣來訪問該成員dynamic_cast<D*>(pb)->g();因爲dynamic_cast轉換後的結果是一個指向派生類的指針,所以可以這樣訪問派生類中特有的成員。但是該語句不影響原來的指針的類型,即基類指針pb仍然是指向基類B的。如果單獨使用該指針仍然不能訪問派生類中特有的成員。一般情況下不推見這樣使用dynamic_cast轉換符,因爲dynamic_cast的轉換並不會總是成功的,具體情況在後面介紹。
  6.2、dynamic_cast的注意事項:dynamic_cast轉換符只能用於指針或者引用。dynamic_cast轉換符只能用於含有虛函數的類。dynamic_cast轉換操作符在執行類型轉換時首先將檢查能否成功轉換,如果能成功轉換則轉換之,如果轉換失敗,如果是指針則反回一個0值,如果是轉換的是引用,則拋出一個bad_cast異常,所以在使用dynamic_cast轉換之間應使用if語句對其轉換成功與否進行測試,比如pd=dynamic_cast<D*>(pb); if(pd){…}else{…},或者這樣測試if(dynamic_cast<D*>(pb)){…}else{…}。
  6.3、const_cast操作符:其表達式爲const_cast<類型>(表達式),其中類型指要把表達式轉換爲的目標類型。該操作符用於改變const和volatile,const_cast最常用的用途就是刪除const屬性,如果某個變量在大多數時候是常量,而在某個時候又是需要修改的,這時就可以使用const_cast操作符了。const_cast操作符不能改變類型的其他方面,他只能改變const或volatile,即const_cast不能把int改變爲double,但可以把const int改變爲int。const_cast只能用於指針或引用。const_cast的用法舉例比如:int a=3; const int *b=&a; int* c;  c=const_cast<int*>(b); *c=4; cout<<a<<*c;這時輸出兩個4,如果不使用const_cast轉換符則常量指針*c的值是不能改變的,在這裏使用const_cast操作符,通過指針b就能改變常量指針和變量a的值
  6.4、static_cast操作符:該操作符用於非多態類型的轉換,任何標準轉換都可以使用他,即static_cast可以把int轉換爲double,但不能把兩個不相關的類對象進行轉換,比如類A不能轉換爲一個不相關的類B類型。static_cast本質上是傳統c語言強制轉換的替代品。  
6.5、reinterpret_cast操作符:該操作符用於將一種類型轉換爲另一種不同的類型,比如可以把一個整型轉換爲一個指針,或把一個指針轉換爲一個整型,因此使用該操作符的危險性較高,一般不應使用該操作符。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章