C風(fēng)格的類型轉(zhuǎn)換很容易理解:
創(chuàng)新互聯(lián)主營貢井網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app開發(fā),貢井h5微信小程序搭建,貢井網(wǎng)站營銷推廣歡迎貢井等地區(qū)企業(yè)咨詢語法:(目標(biāo)類型)表達(dá)式 或 目標(biāo)類型(表達(dá)式);
C++認(rèn)為C風(fēng)格的類型轉(zhuǎn)換過于松散,可能會(huì)帶來隱患,不夠安全。
C++推出了新的類型轉(zhuǎn)換來替代C風(fēng)格的類型轉(zhuǎn)換,采用更嚴(yán)格的語法檢查,降低使用風(fēng)險(xiǎn)。
C++新增了四個(gè)關(guān)鍵字 static_cast、const_cast、reinterpret_cast和dynamic_cast,用于支持C++風(fēng)格的類型轉(zhuǎn)換
C++的類型轉(zhuǎn)換只是語法上的解釋,本質(zhì)上與C風(fēng)格的類型轉(zhuǎn)換沒什么不同,C語言做不到的事情的C++也做不到
語法:
static_cast(表達(dá)式);
const_cast(表達(dá)式);
reinterpret_cast(表達(dá)式);
dynamic_cast(表達(dá)式); //重新解釋
實(shí)際開發(fā)中用的最多(97%)的是static_cast,其它幾種很少用
static_cast
#includeusing namespace std;
void func(void *ptr)
{
double *pp = static_cast(ptr);
//其它代碼
}
//內(nèi)置數(shù)據(jù)類型轉(zhuǎn)換
void test()
{
int ii = 3;
long ll = ii; //絕對安全,可以隱式轉(zhuǎn)換,不會(huì)出現(xiàn)警告
double dd = 1.234;
long ll1 = dd; //可以隱式轉(zhuǎn)換,但是,會(huì)出現(xiàn)可能丟失數(shù)據(jù)的警告
long ll2 = (long)dd; // long(dd) C風(fēng)格:顯示轉(zhuǎn)換,不會(huì)出現(xiàn)警告
long ll3 = static_cast(dd); // C++風(fēng)格:顯示轉(zhuǎn)換,不會(huì)出現(xiàn)警告
}
//指針轉(zhuǎn)換
void test2()
{
int ii = 10;
// double *pd1 = ⅈ//錯(cuò)誤,不能隱私轉(zhuǎn)換
double *pd2 = (double *)ⅈ // C風(fēng)格,強(qiáng)制轉(zhuǎn)換
// double *pd3 = static_cast(&ii); //錯(cuò)誤,static_cast不支持不同烈性指針的轉(zhuǎn)換
void *pv = ⅈ //任何類型的指針都可以隱私轉(zhuǎn)換成void*
double *pd4 = static_cast(pv); // static_cast可以把void*轉(zhuǎn)換成其它類型的指針
}
int main()
{
test();
test2();
return 0;
}
為什么要轉(zhuǎn)換指針呢? 一般是為了調(diào)用函數(shù),指針用于傳遞參數(shù),如果調(diào)用的函數(shù)需要轉(zhuǎn)換指針,可以把它的形參設(shè)計(jì)為void* 類型,調(diào)用的時(shí)候,把其它類型的指針作為實(shí)參傳進(jìn)去,在函數(shù)里面再把void*指針轉(zhuǎn)換成其它類型的指針。
也就是說轉(zhuǎn)換指針的場景是:
其它類型的指針->void*指針->其它類型指針
reinterpret_cast
只為轉(zhuǎn)換指針的場景而設(shè)計(jì)
上面幾種應(yīng)用場景在多線程、函數(shù)回調(diào)和網(wǎng)絡(luò)編程中經(jīng)常用到。
const_cast
static_cast不能丟掉指針(引用)的const和volitale屬性,const_cast可以。
C++中volitale關(guān)鍵字沒什么用,java中的volitale關(guān)鍵字有用的,這里就不見volitale了,有興趣再百度把。
#includeusing namespace std;
void func(void *ptr)
{
double *pp = static_cast(ptr);
//其它代碼
}
//內(nèi)置數(shù)據(jù)類型轉(zhuǎn)換
void test()
{
int ii = 3;
long ll = ii; //絕對安全,可以隱式轉(zhuǎn)換,不會(huì)出現(xiàn)警告
double dd = 1.234;
long ll1 = dd; //可以隱式轉(zhuǎn)換,但是,會(huì)出現(xiàn)可能丟失數(shù)據(jù)的警告
long ll2 = (long)dd; // long(dd) C風(fēng)格:顯示轉(zhuǎn)換,不會(huì)出現(xiàn)警告
long ll3 = static_cast(dd); // C++風(fēng)格:顯示轉(zhuǎn)換,不會(huì)出現(xiàn)警告
}
//指針轉(zhuǎn)換
void test2()
{
int ii = 10;
// double *pd1 = ⅈ//錯(cuò)誤,不能隱私轉(zhuǎn)換
double *pd2 = (double *)ⅈ // C風(fēng)格,強(qiáng)制轉(zhuǎn)換
// double *pd3 = static_cast(&ii); //錯(cuò)誤,static_cast不支持不同烈性指針的轉(zhuǎn)換
void *pv = ⅈ //任何類型的指針都可以隱私轉(zhuǎn)換成void*
double *pd4 = static_cast(pv); // static_cast可以把void*轉(zhuǎn)換成其它類型的指針
}
void func2(void *ptr)
{
// int i = reinterpret_cast(ptr);
// cout<< i<< endl;
}
// reinterpret_cast
// VS里面可以,但是有警告 警告的原因是int和void*占用的內(nèi)存空間不一樣
void test3()
{
int ii = 10;
double *pd3 = reinterpret_cast(&ii);
func2(reinterpret_cast(ii));
}
// long long 和void* 都占8字節(jié)
void func3(void *ptr)
{
long long i = reinterpret_cast(ptr);
cout<< i<< endl;
}
void test4()
{
long long ii = 10;
func3(reinterpret_cast(ii));
}
// const_cast
void func4(int *i) {}
void test5()
{
const int *a = nullptr;
int *b = (int *)a; // C風(fēng)格,強(qiáng)制轉(zhuǎn)換,丟掉const限定符
int *c = const_cast(a); // C++風(fēng)格,強(qiáng)制轉(zhuǎn)換,丟掉const限定符
func4(const_cast(a));
}
int main()
{
test();
test2();
// test3();
test4();
test5();
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧