C++中強制類型轉換

來源:互聯網
上載者:User

C++中強制類型轉換一個有以下四種符號:

 1. static_cast運算子號  
  static_cast<T>(e),stroustrup讓我們可以把它看成隱含轉換的顯示的逆運算。這個是有一定道理的,基於隱式轉化的物件類型我們可以使用static_cast轉化運算子號。它是靜態檢測,無法運行時檢測類型,在繼承中尤為突出。  
  使用範圍  
  <1>用於所有系統類別型之間轉化,不能用於系統類別型指標類型轉化  
      double   t_d   =   0;  
  int   t_i=   static_cast<int>(t_d);   //是合法的轉化  
  而企圖將double*->int*是不允許的  
  <2>用於繼承類之間的轉化(含指標),不能用於其他沒有隱式轉化的物件類型之間的轉化  
  繼承舉例:  
  class   x  
  {  
  };  
  class   y:   public   x  
  {  
  };  
  使用: x   t_o_x;  
  y   t_o_y   =   static_cast<y>(t_o_x);   //x*   y*轉化也可以進行因為x,y繼承關  
  //系,類型可以自動隱式轉化使用  
        隱式轉化舉例:  
  class   x  
  {  
  };  
  class   y  
  {  
   
  public:  
  y(   x   i_x   )   {}  
  };  
  x   t_o_x;  
    y   t_o_y   =   static_cast<y>(t_o_x);   //大家看到y建構函式可以對於x類型隱式轉化  
  //所以可以將x->y,如果企圖將y->x會報錯  
  2. reinterpret_cast   運算  
  主要用於對於類型指標類型的強制轉化,some_type*   ->   special_type*這樣轉化,類型資訊可以是不完全的。它允許將任意指標轉化到其他類型指標,也允許任意整數類型到任意指標類型轉化(BT)。這樣導致的結果是極其不安全的,不能安全的應用於其他目的,除非轉化到原來類型。  
  <1>   使用所有整形可以轉化為任意類型的指標(指標是4位元組的long的東東,那麼機器就認為同類型就是可以轉化)  
  int   c;  
  x*   p   =   reinterpret_cast<x*>(c);   //x是自訂的任意類型,當然包括系統類別型  
  <2>   可以對於任意類型指標之間轉化  
  y*   c;  
  x*   p   =   reinterpret_cast<x*>(c);//x,y代表所有自訂或系統類別型  
  大家可以看到reinterpret_cast的轉化是極度的不負責任的,他只管轉化不檢測是否可以轉化。  
  <3>   const_cast運算子號  
  這個很簡單從名字大家可以看出來,僅僅為了去掉或著加上const修飾符號。但是對於本身定義時為const的類型,即使你去掉const性,在你操作這片內容時候也要小心,只能r不能w操作,否則還是會出錯。  
  const   char*   p   =   "123";  
  char*   c   =   const_cast<char*>(p);  
  c[0]   =   1;     //表面上通過編譯去掉了const性,但是操作其地址時系統依然不允許這  
  //麼做。這是一個漏洞吧  
  <4>   dynamic_cast運算子號  
  Scott   Mayers將其描述為用來執行繼承體系中:安全的向下轉型或者跨系轉型動作。也就是說你可以,用dynamic_cast將   指向base   class的指標或引用轉型為   指向子類的對象的指標或引用。  
  class   B   {};     //polymorphic類型含virtual才能dynamic_cast  
  class   D:   public   B   {}  
  void   f(   B*   pb   )  
  {  
  D*   pd1   =   dynamic_cast<D*>(pb);//如果pb為d類型正確返回,如果不是返回0  
  D*   pd2   =   static_cast<D*>(pb);   //不管怎麼樣都返回指標有可能指向不合適的對  
  //象,因為static僅僅靜態檢測,不能得到運  
  //行時對象的資訊是否真正為D類型  
  }  


本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/Slayers_Nada/archive/2009/05/27/4221496.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.