欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年03月12日 08:33:11   投稿:zx  
這篇文章主要介紹了C++為什么非要引入那幾種類型轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

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

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

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

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

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

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

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; 
} 

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

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

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; 
} 

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

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; 
} 

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

reinterpret_cast

使用方式:

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

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

到此這篇關(guān)于C++為什么非要引入那幾種類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C++ 類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • STL中vector的使用你了解嗎

    STL中vector的使用你了解嗎

    這篇文章主要為大家詳細(xì)介紹了STL中vector的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++ 類的繼承與派生實(shí)例詳解

    C++ 類的繼承與派生實(shí)例詳解

    這篇文章主要介紹了 C++ 類的繼承與派生實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解

    C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于C++Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C++中COM組件初始化方法實(shí)例分析

    C++中COM組件初始化方法實(shí)例分析

    這篇文章主要介紹了C++中COM組件初始化方法,涉及C++中COM組件的使用技巧,需要的朋友可以參考下
    2015-05-05
  • Qt項(xiàng)目實(shí)戰(zhàn)之方塊游戲的實(shí)現(xiàn)

    Qt項(xiàng)目實(shí)戰(zhàn)之方塊游戲的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)簡(jiǎn)易的方塊游戲,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C語言全排列回溯算法介紹

    C語言全排列回溯算法介紹

    大家好,本篇文章主要講的是C語言全排列回溯算法介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++實(shí)現(xiàn)LeetCode(189.旋轉(zhuǎn)數(shù)組)

    C++實(shí)現(xiàn)LeetCode(189.旋轉(zhuǎn)數(shù)組)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(189.旋轉(zhuǎn)數(shù)組),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實(shí)現(xiàn)彈跳小球項(xiàng)目

    C語言實(shí)現(xiàn)彈跳小球項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)彈跳小球項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言 野指針與空指針專篇解讀

    C語言 野指針與空指針專篇解讀

    全網(wǎng)最接地氣的C語言野指針介紹,此處對(duì)于野指針與空指針知識(shí)點(diǎn)做一些簡(jiǎn)要的介紹,作者實(shí)屬初學(xué),寫博客也是作者學(xué)習(xí)的一個(gè)過程,難免文章中有內(nèi)容理解不到位或者有不當(dāng)之處,還請(qǐng)朋友們不吝指正,希望大家多多給予支持,贈(zèng)人玫瑰,手有余香
    2021-11-11
  • 模擬實(shí)現(xiàn)C語言中的內(nèi)存管理

    模擬實(shí)現(xiàn)C語言中的內(nèi)存管理

    這篇文章主要內(nèi)容是模擬C語言中的內(nèi)存管理,需要的朋友可以參考下
    2015-07-07

最新評(píng)論