C/C++學習之static_cast和dynamic_cast、reinterpret_cast

來源:互聯網
上載者:User

原文連結: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;  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.