C++ 四種顯式類型轉換 (十)

來源:互聯網
上載者:User

一、reinterpret_cast:  是特意用於底層的強制轉型,導致實現依賴(implementation-dependent)(不可移植)的結果,

例如,將一個指標轉型為一個整數。             

 string a;
 double *b=static_cast<double*>(&a);
 cout<<b<<" "<<&a<<endl;  //結果只是指標到指標(地址)的拷貝,b和&a地址一樣 

            

還有一些自己定義的對象,等只要是資料差異大均可..
 class A {};
 class B {};
 A * a = new A;
 B * b = reinterpret_cast<B *>(a);
 cout<<a<<b<<endl;               //結果地址一樣       

                                                          

二、static_cast :可以被用於強制隱型轉換(例如,non-const 對象轉型為 const 對象,int 轉型double,等),它還可以用於很多這樣的轉換的反向轉換(例如,void* 指標轉型為有類型指標,基類指標轉型為衍生類別指標),但是它不能將一個 const 對象轉型為 non-const 對象(只有 const_cast 能做到),它最接近於C-style的轉換。
 class Base {};
 class Derived : public Base {};
 Base *a = new Base;
 Derived *b = reinterpret_cast<Derived *>(a);   (轉換子類到父類,相反也可.)
 //上面程式也可用reinterpret_cast類型轉換,因為屬兩個不同類.資料類型差異大
 

static_cast除了操作指標外,也可以操作資料,類似以前簡單類型轉換

,如
     double a=1.111;
     int b=static_cast<int>(a);

 

三、const_cast:  一般用於強制消除對象的常量性。它是唯一能做這一點的 C++ 風格的強制轉型。
 const int a=10;
 int *b= const_cast<int*>(&a);
 *b=9; 
 cout<<*b<<endl;  //可以更改常量了.9

下面是類的常量指標轉為非常量指標  
 class C {};
 const C *a = new C;
 C *b = const_cast<C *>(a);

 

四、dynamic_cast: 主要用於執行“安全的向下轉型(safe downcasting)”,將基類類型的指標或引用安全地轉換為衍生類別型的指標或引用。
當用於多態類型時。dynamic_cast會檢查操作是否有效,static_cast不可檢測,檢測在運行時進行。

1. 如果被轉換的指標不是一個被請求的有效完整的對象指標,傳回值為0.如下:
              class Base { virtual void  dummy() {} };
 class Derived : public Base { };
 Base *basePtr=new Derived;
 Base *basePtr2=new Base;
 if (Derived *derivedPtr = dynamic_cast<Derived*>(basePtr))//第二種情況basePtr改為basePtr2;
 {   //BasePtr points at a Derived object
  cout<<"success"<<endl;
 } else { // BasePtr points at a Base object
  cout<<"BasePtr points at a Base object"<<endl;
 }
              //上面的程式用static_cast也可,只是沒有檢測,第二個指標是無效的...,
              //用reinterprep_cast也可,也沒檢測,不建議...最易出錯
分析上面的程式,basePtr一開始建立了一個Derived類的空間, if強制轉換過程中空間一致,輸出success.
                        而basePtr2一開始建立一個Base空間,而後來強制轉換時空間不一致,輸出 第2個語句

2. 如果一個參考型別執行了類型轉換並且這個轉換是不可能的,一個bad_cast的異常類型被拋出,如下:
 Derived d1;
 Base temp;
 Base &b1=d1;
 Base &b2=temp;
  try
  {
   Derived d2 = dynamic_cast<Derived &>(b1); //第二種情況的話,b1改為b2
  cout<<"success"<<endl;
  }
  catch (bad_cast)
 {
  cout<<"exception..."<<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.