自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 后端
大家好,我是程序喵,今天我們放松下,看一些類型轉(zhuǎn)換的知識(shí)點(diǎn)!

[[386979]]

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

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

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast
  1.  為什么要引入這幾種類型轉(zhuǎn)換,它與C語言中的強(qiáng)制類型轉(zhuǎn)換有什么區(qū)別?
  2.  這四種類型轉(zhuǎn)換分別應(yīng)用在什么場景?

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

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

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

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

static_cast

使用方式: 

  1. #include <iostream>  
  2. using namespace std;  
  3. struct Base {  
  4.     virtual void Func() { cout << "Base Func \n"; }  
  5. }; 
  6. struct Derive : public Base {  
  7.     void Func() override { cout << "Derive Func \n"; }  
  8. };  
  9. int main() {  
  10.     float f = 1.23;  
  11.     cout << "f " << f << endl 
  12.     int i = static_cast<int>(f);  
  13.     cout << "i " << i << endl  
  14.     int *pi = static_cast<int *>(&f);  // error invalid static_cast from type ‘float*’ to type ‘int*’ 
  15.     Derive d;  
  16.     d.Func();  
  17.     Base *b = static_cast<Base *>(&d);  
  18.     b->Func();  
  19.     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進(jìn)行顯示替換,不能使用static_cast在有類型指針之間進(jìn)行類型轉(zhuǎn)換。

dynamic_cast

使用方式: 

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

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

const_cast

使用方式: 

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

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

reinterpret_cast

使用方式: 

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

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

 

責(zé)任編輯:龐桂玉 來源: C語言與C++編程
相關(guān)推薦

2020-12-30 07:55:37

C++轉(zhuǎn)換類型

2024-03-12 08:29:28

C++類型轉(zhuǎn)換方式

2024-05-21 14:04:16

2020-08-12 12:20:09

Python Java編程語言

2011-12-26 15:58:01

枚舉

2010-02-04 16:52:45

C++顯式轉(zhuǎn)換

2022-11-28 09:58:58

C++開發(fā)

2010-03-12 17:29:16

Python模塊

2025-01-20 00:13:19

TypeScript操作符數(shù)據(jù)類型

2016-04-25 14:11:12

華為ICT巡展

2009-08-12 16:26:27

C#數(shù)據(jù)類型轉(zhuǎn)換

2016-12-07 11:23:52

NodeJSC++

2011-07-14 10:39:08

強(qiáng)制類型轉(zhuǎn)換函數(shù)C++

2010-02-03 11:11:18

C++類型轉(zhuǎn)換

2016-12-20 16:35:52

NodeJSC++類型轉(zhuǎn)換

2024-01-24 11:24:03

C++編程異常處理

2010-01-20 14:03:12

C++程序

2010-01-22 15:14:37

學(xué)習(xí)C++

2022-03-11 15:40:49

PaaS云服務(wù)

2021-12-20 23:24:40

前端測試開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號