C 为什么非要引入那几种类型转换?
為什么要引入這幾種類型轉(zhuǎn)換,它與C語言中的強制類型轉(zhuǎn)換有什么區(qū)別?
這四種類型轉(zhuǎn)換分別應(yīng)用在什么場景?
C 為什么要引入這幾種強制類型轉(zhuǎn)換?
我們都知道C 完全兼容C語言,C語言的轉(zhuǎn)換方式很簡單,可以在任意類型之間轉(zhuǎn)換,但這也恰恰是缺點,因為極其不安全,可能不經(jīng)意間將指向const對象的指針轉(zhuǎn)換成非const對象的指針,可能將基類對象指針轉(zhuǎn)成了派生類對象的指針,這種轉(zhuǎn)換很容易出bug,需要嚴格審查代碼才能消除這種隱患,但是C這種轉(zhuǎn)換方式不利于我們審查代碼,且程序運行時也可能會出bug。
而C 引入的這幾種類型轉(zhuǎn)換可以完美的解決上述問題,不同場景下不同需求使用不同的類型轉(zhuǎn)換方式,同時有利于代碼審查。
下面詳細介紹這四種類型轉(zhuǎn)換的使用場景:
static_cast
使用方式:
#include 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;}使用場景:基本數(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進行顯示替換,不能使用static_cast在有類型指針之間進行類型轉(zhuǎn)換。
dynamic_cast
使用方式:
#include 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(b); ? ?dd->Func(); ? ?return 0;}使用場景:用于將父類的指針或引用轉(zhuǎn)換為子類的指針或引用,此場景下父類必須要有虛函數(shù),因為dynamic_cast是運行時檢查,檢查需要運行時信息RTTI,而RTTI存儲在虛函數(shù)表中。
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;}使用場景:用于常量指針或引用與非常量指針或引用之間的轉(zhuǎn)換,只有const_cast才可以對常量進行操作,一般都是用它來去除常量性,去除常量性是危險操作,還是要謹慎操作。
reinterpret_cast
使用方式:
int main() { ? ?int data = 10; ? ?int *pi = &data;float *fpi = reinterpret_cast<float *>(pi);return 0;}使用場景:沒啥場景,類似C語言中的強制類型轉(zhuǎn)換,什么都可以轉(zhuǎn),萬不得已不要使用,一般前三種轉(zhuǎn)換方式不能解決問題了使用這種強制類型轉(zhuǎn)換方式。
聲明:
本文于網(wǎng)絡(luò)整理,版權(quán)歸原作者所有,如來源信息有誤或侵犯權(quán)益,請聯(lián)系我們刪除或授權(quán)事宜。
總結(jié)
以上是生活随笔為你收集整理的C 为什么非要引入那几种类型转换?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos攻击测试网站(如何测试网站防dd
- 下一篇: 政审备案表用来干嘛(政审备案表)