C語言中的類型轉(zhuǎn)換
在C語言中,如果賦值運算符左右兩側(cè)類型不同,或者形參與實參類型不匹配,或者返回值類型與接收返回值類型不一致時,就需要發(fā)生類型轉(zhuǎn)化。
C語言中總共有兩種形式的類型轉(zhuǎn)換:
- 隱式類型轉(zhuǎn)換:編譯器在編譯階段自動進行轉(zhuǎn)換,不能轉(zhuǎn)就編譯失敗。
- 顯式類型轉(zhuǎn)換:需要用戶自己處理。
void Test ()
{
int i = 1;
double d = i; // 隱式類型轉(zhuǎn)換(意義相近的類型)
int* p = &i;
int address = (int) p;// 顯示的強制類型轉(zhuǎn)換(意義不相近的類型,但是值轉(zhuǎn)換后有意義)
}
C語言中的類型轉(zhuǎn)換缺陷:
- 轉(zhuǎn)換的可視性比較差,所有的轉(zhuǎn)換形式都是以一種相同形式書寫,難以跟蹤錯誤的轉(zhuǎn)換。
- 隱式類型轉(zhuǎn)化有些情況下可能會出問題:比如數(shù)據(jù)精度丟失。
- 顯式類型轉(zhuǎn)換將所有情況混合在一起,代碼不夠清晰。
C++強制類型轉(zhuǎn)換
為了彌補C語言類型轉(zhuǎn)換的缺陷,C++提出了自己的類型轉(zhuǎn)化風(fēng)格,并且C++中還可以使用C語言的轉(zhuǎn)化風(fēng)格。
static_cast
static_cast用于非多態(tài)類型的轉(zhuǎn)換(靜態(tài)轉(zhuǎn)換),編譯器隱式執(zhí)行的類型轉(zhuǎn)換(意義相近類型)都可用static_cast,但它不能用于兩個不相關(guān)的類型進行轉(zhuǎn)換。
int main()
{
double d = 12.34;
int a = static_cast<int>(d);
cout << a << endl; //12
return 0;
}
reinterpret_cast
reinterpret_cast操作符通常為操作數(shù)的位模式提供較低層次的重新解釋,用于將一種類型轉(zhuǎn)換為另一種不同的類型,即類型轉(zhuǎn)換為不相近的類型。
int main()
{
double d = 12.34;
int a = static_cast<int>(d); //12
int* p = reinterpret_cast<int*>(a);
cout << p << endl; //000000000000000C
return 0;
}
const_cast
const_cast最常用的用途就是刪除變量的const屬性,方便賦值。
int main()
{
volatile const int a = 2;
int* p = const_cast<int*>(&a);
*p = 3; //修改
cout << a << endl; //3
return 0;
}
編譯器以為a不會改,把a放到了寄存器中,打印的時候去寄存器中拿,加volatile可以去掉編譯器的優(yōu)化,拿到內(nèi)存中正確的值。
dynamic_cast
dynamic_cast用于將一個父類對象的指針/引用轉(zhuǎn)換為子類對象的指針或引用(動態(tài)轉(zhuǎn)換)。
-
向上轉(zhuǎn)型:子類對象指針/引用->父類指針/引用(不需要轉(zhuǎn)換,賦值兼容規(guī)則)
-
向下轉(zhuǎn)型:父類對象指針/引用->子類指針/引用(用dynamic_cast轉(zhuǎn)型是安全的)
-
dynamic_cast只能用于父類含有虛函數(shù)的類。
-
dynamic_cast會先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回nullptr。文章來源:http://www.zghlxwxcb.cn/news/detail-464664.html
-
dynamic_cast會根據(jù)基類指針是否真正指向繼承類指針來做相應(yīng)處理, 即會作出一定的判斷。文章來源地址http://www.zghlxwxcb.cn/news/detail-464664.html
//A*類型指針有可能指向父類,也有可能指向子類 void fun(A* pa) { //如果pa指向子類,那么可以轉(zhuǎn)換,表達式返回正確的地址 //如果pa指向父類,那么不可以轉(zhuǎn)換,表達式返回0 // dynamic_cast會先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回nullptr B* pb = dynamic_cast<B*>(pa); //父類轉(zhuǎn)換為子類安全 //B* pb = (B*)pa; //父類轉(zhuǎn)換為子類不安全 if (pb) { cout << "轉(zhuǎn)換成功" << endl; /// } else { cout << "轉(zhuǎn)換失敗" << endl; } } int main() { A a; B b; fun(&a); fun(&b); return 0; }
到了這里,關(guān)于深入淺出C++——C++的類型轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!