十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
C++的數(shù)據(jù)類(lèi)型轉(zhuǎn)換可分為隱式類(lèi)型轉(zhuǎn)換和顯式類(lèi)型轉(zhuǎn)換

1、隱式類(lèi)型轉(zhuǎn)換
隱式類(lèi)型轉(zhuǎn)換用于內(nèi)置數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。編譯時(shí)編譯器對(duì)數(shù)據(jù)類(lèi)型進(jìn)行轉(zhuǎn)換。
例如:
int nTemp = 36;
float fTemp = nTemp;
隱式類(lèi)型轉(zhuǎn)換也可以通過(guò)表達(dá)式、函數(shù)形參、函數(shù)返回值的方式進(jìn)行。
2、顯式數(shù)據(jù)類(lèi)型轉(zhuǎn)換
2.1 強(qiáng)制類(lèi)型轉(zhuǎn)換
(Type)expr
例如:
float ftemp;
int ntemp = 36;
ftemp = (float)ntemp;
強(qiáng)制類(lèi)型轉(zhuǎn)換使用于C編譯器。
2.2 標(biāo)準(zhǔn)C++的類(lèi)型轉(zhuǎn)換
標(biāo)準(zhǔn)c++使用新的類(lèi)型轉(zhuǎn)換符static_cast、dynamic_cast、reinterpret_cast、const_cast對(duì)類(lèi)型進(jìn)行轉(zhuǎn)換。
1)static_cast
static_cast
static_cast相當(dāng)于傳統(tǒng)的C語(yǔ)言里的強(qiáng)制轉(zhuǎn)換,該運(yùn)算符把expression轉(zhuǎn)換為new_type類(lèi)型,用來(lái)強(qiáng)迫隱式轉(zhuǎn)換如non-const對(duì)象轉(zhuǎn)為const對(duì)象,編譯時(shí)檢查,用于非多態(tài)的轉(zhuǎn)換,可以轉(zhuǎn)換指針及其他,但沒(méi)有運(yùn)行時(shí)類(lèi)型檢查來(lái)保證轉(zhuǎn)換的安全性。它主要有如下幾種用法:
①用于類(lèi)層次結(jié)構(gòu)中基類(lèi)(父類(lèi))和派生類(lèi)(子類(lèi))之間指針或引用的轉(zhuǎn)換。
進(jìn)行上行轉(zhuǎn)換(把派生類(lèi)的指針或引用轉(zhuǎn)換成基類(lèi)表示)是安全的;
進(jìn)行下行轉(zhuǎn)換(把基類(lèi)指針或引用轉(zhuǎn)換成派生類(lèi)表示)時(shí),由于沒(méi)有動(dòng)態(tài)類(lèi)型檢查,所以是不安全的。
②用于基本數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char,把int轉(zhuǎn)換成enum。
③把空指針轉(zhuǎn)換成目標(biāo)類(lèi)型的空指針。
④把任何類(lèi)型的表達(dá)式轉(zhuǎn)換成void類(lèi)型。
注意:static_cast不能轉(zhuǎn)換掉expression的const、volatile、或者_(dá)_unaligned屬性
char a = 'a';
int b = static_cast
double *c = new double;
void *d = static_cast
int e = 10;
const int f = static_cast
const int g = 20;
int *h = static_cast
2)dynamic_cast
dynamic_cast
轉(zhuǎn)換方式:
dynamic_cast
type必須是一個(gè)類(lèi)類(lèi)型且必須是一個(gè)有效的指針
dynamic_cast
type必須是一個(gè)類(lèi)類(lèi)型且必須是一個(gè)左值
dynamic_cast
type必須是一個(gè)類(lèi)類(lèi)型且必須是一個(gè)右值
e的類(lèi)型必須符合以下三個(gè)條件中的任何一個(gè):
① e的類(lèi)型是目標(biāo)類(lèi)型type的公有派生類(lèi)
② e的類(lèi)型是目標(biāo)type的共有基類(lèi)
③ e的類(lèi)型就是目標(biāo)type的類(lèi)型。
如果一條dynamic_cast語(yǔ)句的轉(zhuǎn)換目標(biāo)是指針類(lèi)型并且失敗了,則結(jié)果為0。如果轉(zhuǎn)換目標(biāo)是引用類(lèi)型并且失敗了,則dynamic_cast運(yùn)算符將拋出一個(gè)std::bad_cast異常(該異常定義在typeinfo標(biāo)準(zhǔn)庫(kù)頭文件中)。e也可以是一個(gè)空指針,結(jié)果是所需類(lèi)型的空指針。
dynamic_cast主要用于類(lèi)層次間的上行轉(zhuǎn)換和下行轉(zhuǎn)換,還可以用于類(lèi)之間的交叉轉(zhuǎn)換(cross cast)。
在類(lèi)層次間進(jìn)行上行轉(zhuǎn)換時(shí),dynamic_cast和static_cast的效果是一樣的;在進(jìn)行下行轉(zhuǎn)換時(shí),dynamic_cast具有類(lèi)型檢查的功能,比static_cast更安全。dynamic_cast是唯一無(wú)法由舊式語(yǔ)法執(zhí)行的動(dòng)作,也是唯一可能耗費(fèi)重大運(yùn)行成本的轉(zhuǎn)型動(dòng)作。
指針轉(zhuǎn)換
Derived *dp = dynamic_cast
引用轉(zhuǎn)換
const Derived &d = dynamic_cast
3)reinterpret_cast
reinterpret_cast
reinterpret_cast用于任意類(lèi)型的轉(zhuǎn)換,即reinterpret_cast運(yùn)算符允許將任意指針轉(zhuǎn)換到其他指針類(lèi)型,也允許做任意整數(shù)類(lèi)型和任意指針類(lèi)型之間的轉(zhuǎn)換。轉(zhuǎn)換時(shí),執(zhí)行的是逐個(gè)比特復(fù)制的操作。reinterpret中文意為“重新解釋; 重新詮釋;”。
type-id 必須是一個(gè)指針、引用、算術(shù)類(lèi)型、函數(shù)指針或者成員指針。
reinterpret_cast可以把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),也可以把一個(gè)整數(shù)轉(zhuǎn)換成一個(gè)指針。我們必須知道指針的類(lèi)型,然后把指針轉(zhuǎn)換成整數(shù)和還原到原來(lái)的類(lèi)型。否則這樣的轉(zhuǎn)換是很危險(xiǎn)的。類(lèi)型轉(zhuǎn)換的安全性要程序員自己來(lái)保證。
reinterpret_cast是為了映射到一個(gè)完全不同類(lèi)型的意思,這個(gè)關(guān)鍵詞在我們需要把類(lèi)型映射回原有類(lèi)型時(shí)用到它。我們映射到的類(lèi)型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險(xiǎn)的。
reinterpret_cast使用注意事項(xiàng):
從本質(zhì)上說(shuō)所有這些轉(zhuǎn)換都是不安全的,依賴于實(shí)現(xiàn)的,或兩者都是, reinterpret也不例外(存在安全性)。這種安全性只能由程序員自己來(lái)保證。
4)const_cast
const_cast是一個(gè)基于C語(yǔ)言編程開(kāi)發(fā)的運(yùn)算方法,其主要作用是:修改類(lèi)型的const或volatile屬性。使用該運(yùn)算方法可以返回一個(gè)指向非常量的指針(或引用)指向b1,就可以通過(guò)該指針(或引用)對(duì)它的數(shù)據(jù)成員任意改變。
const_cast
該運(yùn)算符用來(lái)修改類(lèi)型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類(lèi)型是一樣的。
①、常量指針被轉(zhuǎn)化成非常量的指針,并且仍然指向原來(lái)的對(duì)象;
②、常量引用被轉(zhuǎn)換成非常量的引用,并且仍然指向原來(lái)的對(duì)象;
③、const_cast一般用于修改底指針。如const char *p形式。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧