四種顯示轉換的用法

來源:互聯網
上載者:User
文章目錄
  • 1.reinterpret_cast
  •  
  • 2.const_cast
  • 3.static_cast
  • 4.dynamic_cast
  •  
1.reinterpret_cast
/************************************************************************//*         4種顯示轉換的使用方法,含義,使用注意事項:                  *//************************************************************************/#include<iostream>using namespace std;int main(){/*1.reinterpret_cast將一個類型的指標,轉換為另一個類型的指標。這種轉換不用修改指標變數值資料存放格式(不改變指標變數值)只需要在編譯時間重新解指標的類型就可做到;*/double d = 9.3;double *pd = &d;int sized = sizeof(double);int sizei = sizeof(int);cout<<sized<<endl;cout<<sizei<<endl;int *pi = reinterpret_cast<int *>(pd);cout<<"value before changed:"<<pd<<endl;//L1cout<<"value = "<<d<<endl;cout<<"value after  changed:"<<pi<<endl;//L2    cout<<"value = "<<*pi<<endl;return 0;}

從中L1/L2中可以看到指標變數的值並沒有改變。

不能將reinterpret_cast 用於以下幾種情況:

1)非指標類型的轉換

2)contst指標 轉換為void* 指標

 2.const_cast
/*2.const_cast 用於除去指標變數的常量屬性,將它轉換為一個對應指標類型的普通變數。*/int value1 = 0;const int *pci = 0;int *pj  = const_cast<int *>(pci);//L1相當於int *pj = (int *)pci;pj  = &value1;pci = &value1;*pj  = 10;//*pci = 20; //報錯error C2166: l-value specifies const object

 

其中不能夠將L1語句替換為:

int *pj = pci;

 

其中可以將非const指標變數轉換為 const 指標變數:

int  *i = 0;int const *_i = const_cast<const int *>(i);

因為cont int *不能夠轉換為int *。

不能夠將const_cast用於以下情況:

1)無法將非指標的常變數轉換為普通變數。

 

3.static_cast

 

/*3.static_cast 主要用於基本類型之間和具有繼承關係的類型之間的轉換,這種轉換一般會更改變數的內部表示方式,因此static_cast應用於指標類型轉換,沒有太大意義,即使允許指標類型轉換,也不及reinterpret_cast解釋效率高。*///1)基本類型轉換int i = 0;double d = static_cast<double>(i);int j = static_cast<int>(d);//2)轉換繼承類型的對象為基類對象。class Base{};class Derived:public Base{};Derived d1;Base b1 = static_cast<Base>(d1);

 

4.dynamic_cast
/*4.與靜態static_const 相對,是動態dynamic_cast轉換。這種轉換是在運行時,進行轉換的,並非在編譯時間進行,明顯區別於上面3個類型轉換操作。其只能在繼承對象的指標之間或引用進行類型轉換。*///繼承,指標class Base{};class Derived:public Base{};Derived *pd = new Derived;Base *pb = dynamic_cast<Base *>(pd);if (!pb){cout<<"change success"<<endl;}else{cout<<"change failed"<<endl;}//繼承,引用  Derived d;Base &b = dynamic_cast<Base &>(d);//沒有繼承關係,但是被轉換的類有虛函數class A{virtual ~A(){}};class B{};A* pa1 = new A;B* pb1 = dynamic_cast<B*>(pa1);if (!pb){cout<<"dynamic_cast success"<<endl;}else{cout<<"dynamic_cast failed"<<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.