淺談C++為什么非要引入那幾種類型轉(zhuǎn)換
眾所周知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)文章
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-04Qt項(xiàng)目實(shí)戰(zhàn)之方塊游戲的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)簡(jiǎn)易的方塊游戲,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03C++實(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