原文連結:http://www.cppblog.com/newcnzz/archive/2012/09/29/192428.html
C++提供了四個轉換運算子:const_cast <new_type> (expression)static_cast <new_type> (expression)reinterpret_cast <new_type> (expression)dynamic_cast <new_type> (expression) dynamic_cast: 通常在基類和衍生類別之間轉換時使用; static_cast: 一般的轉換,如果你不知道該用哪個,就用這個。 reinterpret_cast: 用於進行沒有任何關聯之間的轉換,比如一個字元指標轉換為一個整形數。 static_cast在編譯時間期強制轉換,dynamic_cast在運行時期轉換(較安全) ,reinterpret_cast主要是將資料從一種類型的轉換為另一種類型。static_cast是c語言的強制轉換代替品,dynamic_cast可以協助你實現虛函數的功能!reinterpret_cast它可以把一個指標轉換成一個整數,也可以把一個整數轉換成一個指標! static_cast和dynamic_cast是c++中的rtti的兩個操作符。 其中static_cast是相當於c的強制類型轉換,用起來可能有一點危險。dynamic_cast如果轉換成引用出錯的話,就會出現異常, 這裡需要做一個異常處理的機制。轉換指標出錯返回null。 dynamic_cast可以轉換指標和和引用(基類到衍生類別),不能用來轉換對象."安全的向下轉換",它通過c++的dynamic_cast運算子來實現。 當對一個指標使用dynamic_cast時,先嘗試轉換,如果成功,就返回新類型的合法指標;如果dynamic_cast失敗,返回null 指標! //運行如下程式[cpp] view plaincopy#include <iostream> using namespace std; class A { public: virtual void show() { std::cout<<"A::show()"<<endl; } }; class B : public A { public: virtual void show() { std::cout<<"B::show()"<<endl; } }; int main() { A *pa=new A(); B *pb=new B(); cout<<"-------- 1 ----------"<<endl; static_cast<A *>(pb)->show(); //print:"B::show()" cout<<"-------- 2 ----------"<<endl; dynamic_cast<A *>(pb)->show();//also print:"B::show()" cout<<"-------- 3 ----------"<<endl; static_cast<B *>(pa)->show(); //print:"A::show()" cout<<"-------- 4 ----------"<<endl; //dynamic_cast<B *>(pa)->show(); //此處會出現異常 if((pb = dynamic_cast<B*>(pa))) { pb->show(); }else { cout << "dynamic cast fail" << endl; } } 輸出為:-------- 1 ----------B::show()-------- 2 ----------B::show()-------- 3 ----------A::show()-------- 4 ----------dynamic cast fail 記住:如果使用VC編譯的話,一定要選擇上RTTI支援,否則運行時會出異常的。static_cast並不允許兩個完全不相干的類互相轉換.注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性。reinterpret_cast是為了映射到一個完全不同類型的意思,這個關鍵詞在我們需要把類型映射回原有類型時用到它。我們映射到的類型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險的。reinterpret_cast用在任意指標(或引用)類型之間的轉換;以及指標與足夠大的整數類型之間的轉換;從整數類型(包括枚舉類型)到指標類型,無視大小。 OK下面看一個static_cast和reinterpret_cast的執行個體:[cpp] view plaincopyint i; char s = 'a'; i = static_cast<int>(s); cout << i << endl; char *ss = "ssss"; i = reinterpret_cast<int>(ss); cout << i << endl;