成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[361030]]

本文轉載自微信公眾號「程序喵大人」,作者程序喵大人 。轉載本文請聯系程序喵大人公眾號。

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

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

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

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

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

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

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

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

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

  1. static_cast 

使用方式:

  1. #include <iostream> 
  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<int>(f); 
  17.     cout << "i " << i << endl; 
  18.  
  19.     int *pi = static_cast<int *>(&f);  // error invalid static_cast from type ‘float*’ to type ‘int*’ 
  20.  
  21.     Derive d; 
  22.     d.Func(); 
  23.     Base *b = static_cast<Base *>(&d);  
  24.     b->Func(); 
  25.     return 0; 

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

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

  1. dynamic_cast 

使用方式:

  1. #include <iostream> 
  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<Base *>(&d); 
  17.     b->Func(); 
  18.     Derive *dd = dynamic_cast<Derive *>(b); 
  19.     dd->Func(); 
  20.     return 0; 

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

  1. const_cast 

使用方式:

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

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

  1. reinterpret_cast 

使用方式:

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

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

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2021-03-11 14:46:05

C++類型轉換語言

2024-03-12 08:29:28

C++類型轉換方式

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++顯式轉換

2016-04-25 14:11:12

華為ICT巡展

2022-11-28 09:58:58

C++開發

2010-03-12 17:29:16

Python模塊

2025-01-20 00:13:19

TypeScript操作符數據類型

2016-12-07 11:23:52

NodeJSC++

2009-08-12 16:26:27

C#數據類型轉換

2010-01-22 15:14:37

學習C++

2010-01-20 14:03:12

C++程序

2024-01-24 11:24:03

C++編程異常處理

2010-02-03 11:11:18

C++類型轉換

2011-07-14 10:39:08

強制類型轉換函數C++

2016-12-20 16:35:52

NodeJSC++類型轉換

2021-12-20 23:24:40

前端測試開發

2021-12-03 17:22:09

CC++編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男女爱爱福利视频 | 高清欧美性猛交 | 狠狠av| 欧美一级片黄色 | 成人不卡一区二区 | 色网站在线免费观看 | 精品国产不卡一区二区三区 | 综合久久久 | 国产精品亚洲成在人线 | 青草青草久热精品视频在线观看 | 成人免费一区二区三区视频网站 | 99精品在线 | 亚洲国产精品一区二区久久 | 国产小视频在线看 | 夜夜艹| 亚洲一区国产精品 | 久久精品国产一区二区三区不卡 | 极品在线 | 欧美1区| 精品欧美激情在线观看 | 黄色毛片一级 | 精品亚洲一区二区三区 | 国产精品自拍视频 | 在线观看免费av网 | 亚洲网站免费看 | 国产亚洲一区精品 | 国产精品日韩一区 | 欧美性猛交一区二区三区精品 | 日韩一区二区在线视频 | 精品成人 | 天堂中文av | 久久国产精品视频 | 在线观看www高清视频 | 看毛片的网站 | 日韩一区二区久久 | 日韩欧美国产精品 | 国产线视频精品免费观看视频 | 日韩久久久久久久久久久 | 亚洲精品欧洲 | 日日骚av | 国产91色在线 | 亚洲 |