【C++】四種強制型別轉換
阿新 • • 發佈:2018-12-18
強制型別轉換在有些地方起到了很大的作用,在看C++中的強制型別轉換時,我們首先看一下我們熟悉的C語言中的強制型別轉換。
一.C語言的強制型別轉換
C語言中強制型別轉換分為兩種:
- 隱式型別轉換(相似型別轉換,及相關型別的轉換,這裡和型別提升也優點相似)
- 顯示型別轉換(不相關型別之間的轉換,比如指標和整型)
int main() { int i = 1; double b = i;//隱式型別轉換 printf("%d,%2fd\n", i, b); int* p = &i; int num = (int)p;//顯示型別轉換 printf("%x,%d\n", p, num); system("pause"); return 0; }
我們看到C語言中的兩種強制型別轉換,其中的隱式型別轉換存在很大的弊端,比如:陣列中在任意位置插入,需要將元素向後搬移,這就有可能產生錯誤,這裡就不做程式碼演示了。感興趣的同學可以留言,我會貼出來。而且C語言的強制型別轉換我們可以看到不夠規範,這使得程式碼的可讀性降低了很大。
二.C++的強制型別轉換
1.static_cast:用於非多型型別轉換(靜態轉換),任何標準轉換都可以用它,但是不能用於兩個不相關的型別轉換。
int i = 10; double b = static_cast<double>(i); cout << i << " " << b << endl;
2.reinterpret_cast:將一種型別轉換為另一種不同的型別。
int i = 10;
int* b = reinterpret_cast<int*>(i);
cout << i << " " << b << endl;
3.const_cast:刪除變數const的屬性,方便賦值
1.)在看這個強制型別轉換之前,我們首先看一下C語言中一個有趣的事情。
int main() { const int i = 3; int* p = (int*)&i; *p = 4; printf("%d\n", i); system("pause"); return 0; }
我們首先看一下,該程式會輸出什麼勒????可能很多同學會認為是輸出4,其實不然。其實是3.我們來看以下編譯器迷惑的地方。
我們開啟監視視窗發現,明明是4,為什麼輸出的是3勒,這個看起來就有點扯了。我們在開啟彙編程式碼看一下。
我們看到函式在呼叫堆疊的時候,push進去的是3,那麼在pop出棧的時候肯定也是3.這就相當於將i這個值放在了暫存器上,並不是記憶體上。
2.)C++中的const_cast
const int i = 3;
int* p = const_cast<int*>(&i);
*p = 3;
cout << p << " " << i << endl;
4.dynamic_cast:用於將一個父類物件的指標轉換為子類物件的指標或引用。(動態交換)
- 向上轉型:子類物件指標-->父類物件指標/引用(不需要轉化)
- 向下轉型:父類物件指標-->子類物件指標/引用(用dynamic_cast轉型是安全的)
注意:
- dynam_cast:只能用於是多型的類(必須有共有繼承和虛擬函式)
- dynam_cast:會先檢查能否轉型成功,能成功則轉型,不能成功則返回0