日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++為什么非要引入那幾種類型轉(zhuǎn)換?

本文轉(zhuǎn)載自微信公眾號「程序喵大人」,作者程序喵大人 。轉(zhuǎn)載本文請聯(lián)系程序喵大人公眾號。

創(chuàng)新互聯(lián)主要從事做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)興山,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

大家好,我是程序喵,今天我們放松下,看一些類型轉(zhuǎn)換的知識點!

眾所周知C++關(guān)于類型轉(zhuǎn)換引入了四種方式:

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

為什么要引入這幾種類型轉(zhuǎn)換,它與C語言中的強制類型轉(zhuǎn)換有什么區(qū)別?

這四種類型轉(zhuǎn)換分別應(yīng)用在什么場景?

C++為什么要引入這幾種強制類型轉(zhuǎn)換?

我們都知道C++完全兼容C語言,C語言的轉(zhuǎn)換方式很簡單,可以在任意類型之間轉(zhuǎn)換,但這也恰恰是缺點,因為極其不安全,可能不經(jīng)意間將指向const對象的指針轉(zhuǎn)換成非const對象的指針,可能將基類對象指針轉(zhuǎn)成了派生類對象的指針,這種轉(zhuǎn)換很容易出bug,需要嚴格審查代碼才能消除這種隱患,但是C這種轉(zhuǎn)換方式不利于我們審查代碼,且程序運行時也可能會出bug。

而C++引入的這幾種類型轉(zhuǎn)換可以完美的解決上述問題,不同場景下不同需求使用不同的類型轉(zhuǎn)換方式,同時有利于代碼審查。

下面詳細介紹這四種類型轉(zhuǎn)換的使用場景:

 
 
 
  1. static_cast 

使用方式:

 
 
 
  1. #include  
  2.  
  3. using namespace std; 
  4.  
  5. struct Base { 
  6.     virtual void Func() { cout << "Base Func \n"; } 
  7. }; 
  8.  
  9. struct Derive : public Base { 
  10.     void Func() override { cout << "Derive Func \n"; } 
  11. }; 
  12.  
  13. int main() { 
  14.     float f = 1.23; 
  15.     cout << "f " << f << endl; 
  16.     int i = static_cast(f); 
  17.     cout << "i " << i << endl; 
  18.  
  19.     int *pi = static_cast(&f);  // error invalid static_cast from type ‘float*’ to type ‘int*’ 
  20.  
  21.     Derive d; 
  22.     d.Func(); 
  23.     Base *b = static_cast(&d);  
  24.     b->Func(); 
  25.     return 0; 

使用場景:基本數(shù)據(jù)類型之間的轉(zhuǎn)換使用,例如float轉(zhuǎn)int,int轉(zhuǎn)char等,在有類型指針和void*之間轉(zhuǎn)換使用,子類對象指針轉(zhuǎn)換成父類對象指針也可以使用static_cast。

非多態(tài)類型轉(zhuǎn)換一般都使用static_cast,而且最好把所有的隱式類型轉(zhuǎn)換都是用static_cast進行顯示替換,不能使用static_cast在有類型指針之間進行類型轉(zhuǎn)換。

 
 
 
  1. dynamic_cast 

使用方式:

 
 
 
  1. #include  
  2.  
  3. using namespace std; 
  4.  
  5. struct Base { 
  6.     virtual void Func() { cout << "Base Func \n"; } 
  7. }; 
  8.  
  9. struct Derive : public Base { 
  10.     void Func() override { cout << "Derive Func \n"; } 
  11. }; 
  12.  
  13. int main() { 
  14.     Derive d; 
  15.     d.Func(); 
  16.     Base *b = dynamic_cast(&d); 
  17.     b->Func(); 
  18.     Derive *dd = dynamic_cast(b); 
  19.     dd->Func(); 
  20.     return 0; 

使用場景:用于將父類的指針或引用轉(zhuǎn)換為子類的指針或引用,此場景下父類必須要有虛函數(shù),因為dynamic_cast是運行時檢查,檢查需要運行時信息RTTI,而RTTI存儲在虛函數(shù)表中,關(guān)于虛函數(shù)表具體可以看我的這篇文章:面試系列之C++的對象布局

 
 
 
  1. const_cast 

使用方式:

 
 
 
  1. int main() { 
  2.     int data = 10; 
  3.     const int *cpi = &data; 
  4.  
  5.     int *pi = const_cast(cpi); 
  6.  
  7.     const int *cpii = const_cast(pi); 
  8.     return 0; 

使用場景:用于常量指針或引用與非常量指針或引用之間的轉(zhuǎn)換,只有const_cast才可以對常量進行操作,一般都是用它來去除常量性,去除常量性是危險操作,還是要謹慎操作。

 
 
 
  1. reinterpret_cast 

使用方式:

 
 
 
  1. int main() { 
  2.     int data = 10; 
  3.     int *pi = &data; 
  4.  
  5.     float *fpi = reinterpret_cast(pi); 
  6.  
  7.     return 0; 

使用場景:沒啥場景,類似C語言中的強制類型轉(zhuǎn)換,什么都可以轉(zhuǎn),萬不得已不要使用,一般前三種轉(zhuǎn)換方式不能解決問題了使用這種強制類型轉(zhuǎn)換方式。


分享標題:C++為什么非要引入那幾種類型轉(zhuǎn)換?
當前路徑:http://m.5511xx.com/article/dpedcdg.html