在将varchar值id转换为int时失败_C++繁琐的类型转换,C++小知识之四种类型转换
有時(shí),編程的過(guò)程中需要將值從一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。
在C語(yǔ)言中,強(qiáng)制類型轉(zhuǎn)換的方式為(Type)Expression,另外還有一種現(xiàn)在已經(jīng)不用的舊式寫法Type(Expression),這兩種方式是等價(jià)的。
但是,C語(yǔ)言的強(qiáng)制類型轉(zhuǎn)換方式存在一些問(wèn)題:過(guò)于粗暴,可以在任意類型之間進(jìn)行轉(zhuǎn)換,編譯器很難判斷其正確性,難于定位,在源代碼中無(wú)法快速定位所有使用強(qiáng)制類型轉(zhuǎn)換的語(yǔ)句。
然而,強(qiáng)制類型轉(zhuǎn)換在實(shí)際工程中幾乎是不可避免的,為此C++將強(qiáng)制類型轉(zhuǎn)換分為4種不同的類型,以提供更加安全可靠的轉(zhuǎn)換。
static_cast
用法:static_cast (expression)
該運(yùn)算符把expression轉(zhuǎn)換為type-id類型,但沒有運(yùn)行時(shí)類型檢查來(lái)保證轉(zhuǎn)換的安全性。它主要有如下幾種用法:
(1)用于類層次結(jié)構(gòu)中基類和派生類之間指針或引用的轉(zhuǎn)換。
進(jìn)行上行轉(zhuǎn)換(把派生類的指針或引用轉(zhuǎn)換成基類表示)是安全的
進(jìn)行下行轉(zhuǎn)換(把基類的指針或引用轉(zhuǎn)換為派生類表示),由于沒有動(dòng)態(tài)類型檢查,所以是不安全的
(2)用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char。這種轉(zhuǎn)換的安全也要開發(fā)人員來(lái)保證
(3)把空指針轉(zhuǎn)換成目標(biāo)類型的空指針
(4)把任何類型的表達(dá)式轉(zhuǎn)換為void類型
注意:static_cast不能轉(zhuǎn)換掉expression的const、volitale或者_(dá)_unaligned屬性。主要用于基本類型之間、有繼承關(guān)系的類對(duì)象之間、類指針之間的轉(zhuǎn)換,不能用于基本類型指針之間的轉(zhuǎn)換。
比如:下面代碼第五行會(huì)報(bào)錯(cuò),“static_cast”: 無(wú)法從“float *”轉(zhuǎn)換為“int *”
const_cast
用法:const_cast (expression)
該運(yùn)算符用來(lái)修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。
常量指針被轉(zhuǎn)化成非常量指針,并且仍然指向原來(lái)的對(duì)象;
常量引用被轉(zhuǎn)換成非常量引用,并且仍然指向原來(lái)的對(duì)象;常量對(duì)象被轉(zhuǎn)換成非常量對(duì)象。
注意:用于去除變量的只讀屬性,強(qiáng)制轉(zhuǎn)換的目標(biāo)類型必須是指針或引用
比如:下面代碼第二行會(huì)報(bào)錯(cuò),“const_cast”: 無(wú)法從“const int”轉(zhuǎn)換為“int”,值得注意的是,強(qiáng)轉(zhuǎn)去掉常量屬性之后通過(guò)指針修改變量,并不能改變?cè)境A康闹?#xff0c;在【C++const常量玩出新花樣】中有講到
結(jié)果:
reinterpret_cast
用法:reinterpret_cast (expression)
它可以把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),也可以把一個(gè)整數(shù)轉(zhuǎn)換成一個(gè)指針(先把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),在把該整數(shù)轉(zhuǎn)換成原類型的指針,還可以得到原先的指針值)。
該運(yùn)算符的用法比較多。
該運(yùn)算符平臺(tái)移植性比價(jià)差。
注意:type-id必須是一個(gè)指針、引用、算術(shù)類型、函數(shù)指針或者成員指針。用于指針類型之間、整數(shù)和指針類型之間的轉(zhuǎn)換
比如:下面代碼第三行會(huì)報(bào)錯(cuò),“reinterpret_cast”: 無(wú)法從“float”轉(zhuǎn)換為“int”。
dynamic_cast
用法:dynamic_cast (expression)該運(yùn)算符把expression轉(zhuǎn)換成type_id類型的對(duì)象。type_id必須是類的指針、引用或者void*;如果type_id是類指針類型,那么expression也必須是一個(gè)指針,如果type_id是一個(gè)引用,那么expression也必須是一個(gè)引用。 dynamic_cast主要用于有繼承關(guān)系的類層次間的上行轉(zhuǎn)換和下行轉(zhuǎn)換,還可以用于類之間的交叉轉(zhuǎn)換。
在類層次間進(jìn)行上行轉(zhuǎn)換時(shí),dynamic_cast和static_cast的效果是一樣的;
在進(jìn)行下行轉(zhuǎn)換時(shí),dynamic_cast具有類型檢查的功能,比static_cast更安全。
#include using namespace std;class parent{public:virtual void print(){cout << "parent" << endl;}};class son :public parent{public: void print(){cout << "son" << endl; } void printData() { cout << "printData" << endl; }};int main(){parent* ppParent = new son; //調(diào)用是子類中與virtual 的同名函數(shù)ppParent->print();//調(diào)用是子類中與virtual 的同名函數(shù)son* ppSon = nullptr;if ((ppSon = dynamic_cast(ppParent)) != nullptr){ppSon->print(); ppSon->printData();}else{cout << "轉(zhuǎn)換失敗" << endl;}system("pause");return 0;}尾言
如果足下基礎(chǔ)比較差,不妨關(guān)注下人人都可以學(xué)習(xí)的視頻教程通俗易懂,深入淺出,一個(gè)視頻只講一個(gè)知識(shí)點(diǎn)。視頻不深?yuàn)W,不需要鉆研,在公交、在地鐵、在廁所都可以觀看,隨時(shí)隨地漲姿勢(shì)的視頻教程
總結(jié)
以上是生活随笔為你收集整理的在将varchar值id转换为int时失败_C++繁琐的类型转换,C++小知识之四种类型转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python固定数据类型_Python的
- 下一篇: 运行时常量池在哪里_C++干货系列——从