<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## C++中的類型強制轉換 《Effective C++》中將c語言強制類型轉換稱為**舊式轉型**,c++強制類型轉換稱為**新式轉型**。 * dynamic_cast: ? 通常在基類和派生類之間轉換時使用,run-time ? cast * const_cast: ? 主要針對const和volatile的轉換.? * static_cast: ? 一般的轉換,no ? run-time ? check.通常,如果你不知道該用哪個,就用這個。??? * reinterpret_cast: ? 用于進行沒有任何關聯之間的轉換,比如一個字符指針轉換為一個整形數。 ## static_cast<T*> a static_cast相當于傳統的**C語言里的強制轉換**,該運算符把expression轉換為new_type類型,用來強迫隱式轉換,例如non-const對象轉為const對象,編譯時檢查,用于非多態的轉換,可以轉換指針及其他,但*沒有運行時類型檢查來保證轉換的安全性*。它主要有如下幾種用法: ①用于類層次結構中基類(父類)和派生類(子類)之間指針或引用的轉換。 * 進行上行轉換(把派生類的指針或引用轉換成基類表示)是**安全**的;* * 進行下行轉換(把基類指針或引用轉換成派生類表示)時,由于沒有動態類型檢查,所以是**不安全**的。* ②用于基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。 ③把空指針轉換成目標類型的空指針。 ④把任何類型的表達式轉換成void類型。 >注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性。 ## dynamic_cast<T*> a ``` dynamic_cast<type*>(e) //type必須是一個有效的指針 dynamic_cast<type&>(e) // type必須是一個左值 dynamic_cast<type&&>(e) // type必須是一個右值 ``` * e的類型必須符合以下三個條件中的任何一個: * e的類型是是目標類型type的公有派生類 * e的類型是目標type的共有基類 * e的類型就是目標type的的類型。 >如果一條dynamic_cast語句的轉換目標是指針類型并且失敗了,則結果為0。如果轉換目標是引用類型并且失敗了,則dynamic_cast運算符將拋出一個std::bad_cast異常(該異常定義在typeinfo標準庫頭文件中)。e也可以是一個空指針,結果是所需類型的空指針。 ### dynamic_cast的應用 dynamic_cast主要用于**類層次間**的上行轉換和下行轉換,還可以用于**類之間**的交叉轉換(cross cast)。 * 在類層次間進行上行轉換時 :dynamic_cast和static_cast的效果是一樣的; * 在進行下行轉換時: dynamic_cast具有類型檢查的功能,比static_cast更安全。dynamic_cast是唯一無法由舊式語法執行的動作,也是唯一可能耗費重大運行成本的轉型動作 1. 指針類型 舉例,Base為包含至少一個虛函數的基類,Derived是Base的共有派生類,如果有一個指向Base的指針bp,我們可以在運行時將它轉換成指向Derived的指針,代碼如下: ``` if(Derived *dp = dynamic_cast<Derived *>(bp)){ //使用dp指向的Derived對象 } else{ //使用bp指向的Base對象 } ``` >值得注意的是,在上述代碼中,if語句中定義了dp,這樣做的好處是可以在一個操作中同時完成類型轉換和條件檢查兩項任務。 2. 引用類型 因為不存在所謂空引用,所以引用類型的dynamic\_cast轉換與指針類型不同,在引用轉換失敗時,會拋出std::bad\_cast異常,該異常定義在頭文件typeinfo中。 ``` void f(const Base &b){ try{ const Derived &d = dynamic_cast<const Base &>(b); //使用b引用的Derived對象 } catch(std::bad_cast){ //處理類型轉換失敗的情況 } } ``` ## const_cast const_cast,用于修改類型的const或volatile屬性。? 該運算符用來修改類型的const(唯一有此能力的C++-style轉型操作符)或volatile屬性。除了const 或volatile修飾之外, new\_type和expression的類型是一樣的。 ①常量指針被轉化成非常量的指針,并且仍然指向原來的對象; ②常量引用被轉換成非常量的引用,并且仍然指向原來的對象; ③const_cast一般用于修改底指針。如const char \*p形式。 舉例轉換如下: ``` const int g = 20; int *h = const_cast<int*>(&g);//去掉const常量const屬性 const int g = 20; int &h = const_cast<int &>(g);//去掉const引用const屬性 const char *g = "hello"; char *h = const_cast<char *>(g);//去掉const指針const屬性 ``` ## reinterpret_cast new_type必須是一個指針、引用、算術類型、函數指針或者成員指針。它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,再把該整數轉換成原類型的指針,還可以得到原先的指針值)。 >reinterpret_cast意圖執行低級轉型,實際動作(及結果)可能取決于編輯器,這也就表示它**不可移植** 舉一個錯誤使用reintepret\_cast例子,將整數類型轉換成函數指針后,vc++在執行過程中會報"...中的 0xxxxxxxxx 處有未經處理的異常: 0xC0000005: Access violation"錯誤: ``` #include <iostream> using namespace std; int output(int p){ cout << p <<endl;  return 0; } typedef int (*test_func)(int );//定義函數指針test_func int main(){ int p = 10; test_func fun1 = output; fun1(p);//正確 test_func fun2 = reinterpret_cast<test_func>(&p); fun2(p);//...處有未經處理的異常: 0xC0000005: Access violation return 0; } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看