亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++為什么非要引入那幾種類型轉換

發布時間:2021-03-12 17:15:12 來源:億速云 閱讀:158 作者:TREX 欄目:開發技術

這篇文章主要講解了“C++為什么非要引入那幾種類型轉換”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++為什么非要引入那幾種類型轉換”吧!

眾所周知C++關于類型轉換引入了四種方式:

  • static_cast

  • const_cast

  • dynamic_cast

  • reinterpret_cast

 為什么要引入這幾種類型轉換,它與C語言中的強制類型轉換有什么區別?

這四種類型轉換分別應用在什么場景?

C++為什么要引入這幾種強制類型轉換?

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

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

下面詳細介紹這四種類型轉換的使用場景:

static_cast

使用方式:

#include <iostream> 
using namespace std; 
struct Base { 
  virtual void Func() { cout << "Base Func \n"; } 
}; 
struct Derive : public Base { 
  void Func() override { cout << "Derive Func \n"; } 
}; 
int main() { 
  float f = 1.23; 
  cout << "f " << f << endl; 
  int i = static_cast<int>(f); 
  cout << "i " << i << endl;  
  int *pi = static_cast<int *>(&f); // error invalid static_cast from type ‘float*' to type ‘int*' 
  Derive d; 
  d.Func(); 
  Base *b = static_cast<Base *>(&d); 
  b->Func(); 
  return 0; 
}

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

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

dynamic_cast

使用方式:

#include <iostream> 
using namespace std; 
struct Base { 
  virtual void Func() { cout << "Base Func \n"; } 
}; 
struct Derive : public Base { 
  void Func() override { cout << "Derive Func \n"; } 
}; 
int main() { 
  Derive d; 
  d.Func(); 
   Base *b = dynamic_cast<Base *>(&d); 
  b->Func(); 
   Derive *dd = dynamic_cast<Derive *>(b); 
  dd->Func(); 
  return 0; 
}

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

const_cast

使用方式:

int main() { 
  int data = 10; 
  const int *cpi = &data; 
  int *pi = const_cast<int *>(cpi); 
  const int *cpii = const_cast<const int *>(pi); 
  return 0; 
}

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

reinterpret_cast

使用方式:

int main() { 
  int data = 10; 
  int *pi = &data; 
  float *fpi = reinterpret_cast<float *>(pi); 
  return 0; 
}

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

感謝各位的閱讀,以上就是“C++為什么非要引入那幾種類型轉換”的內容了,經過本文的學習后,相信大家對C++為什么非要引入那幾種類型轉換這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

航空| 承德县| 广水市| 呼伦贝尔市| 拉萨市| 稻城县| 安岳县| 桃江县| 抚顺县| 威信县| 永顺县| 新平| 泰宁县| 黎平县| 肥东县| 延庆县| 广饶县| 渝北区| 靖远县| 星子县| 蒙山县| 普格县| 贵阳市| 龙井市| 闽侯县| 宁津县| 姜堰市| 邛崃市| 郯城县| 泰来县| 凯里市| 义马市| 浠水县| 友谊县| 三穗县| 龙江县| 彩票| 调兵山市| 日喀则市| 盱眙县| 裕民县|