1首先來回顧C的強制轉換 大家都知道,在編譯C語言中的強制轉換時,編譯器不會檢查轉換是否成功,都會編譯正確. 比如: 輸出結果如下圖所示: 從上圖可以看到,只有當運行代碼時,才會出現段錯誤問題. 當C代碼上千行時,若出現這種問題,是非常難找的. 2.C++的新型類型轉換 所以在C++中,便引入了4種 ...
1首先來回顧C的強制轉換
大家都知道,在編譯C語言中的強制轉換時,編譯器不會檢查轉換是否成功,都會編譯正確.
比如:
#include "stdio.h" struct Position { int x; int y; }; int main() { int i; struct Position *p; i=0x123456; p=(struct Position *)i; printf("px=%d,py=%d\n",p->x,p->y); }
輸出結果如下圖所示:
從上圖可以看到,只有當運行代碼時,才會出現段錯誤問題.
當C代碼上千行時,若出現這種問題,是非常難找的.
2.C++的新型類型轉換
所以在C++中,便引入了4種強制類型轉換
2.1 static_cast(靜態類型轉換)
- 用於基本數據類型之間的轉換(char,int,const int等)
- 不能用於基本數據類型指針之間的轉換(char *,int *等)
- 用於有繼承關係類對象之間的轉換
- 用於類指針之間的轉換
例如:
int i = 0x45; char c = 'c'; c = static_cast<char>(i); //char* pc = static_cast<char*>(&i); //此行錯誤,不能用於基本指針之間轉換
2.2 const_cast(去常類型轉換)
- 用於去除變數的只讀屬性
- 且強制轉換的類型必須是指針*或引用&
例如:
const int x =1; //const:定義一個常量x const int& j =2; //const引用:定義一個只讀變數j int& p1= const_cast<int&>(x); //強制轉換int & int *p2 = const_cast<int*>(&j); //強制轉換int* //int p3 = const_cast<int>(j); //此行錯誤,不能轉換普通數據型 p1=3; *p2=4; printf("x=%d, j=%d\n",x,j); printf("p1=%d *p2=%d\n",p1,*p2);
輸出結果:
x=1 j=4 p1=3 *p2=4
從輸出結果,可以看出修改p1,p2,只有j內容變換了,是因為變數j用const引用定義的,所以是個只讀變數.
2.3 dynamic_cast(動態類型轉換)
- 用於有繼承關係的類指針間的轉換
- 用於有交叉關係的類指針間的轉換
- 具有類型檢查的功能
- 需要虛函數的支持
- 不能用於基本數據類型指針之間的轉換(char *,int *等)
2.4 reinterpret_ cast(解讀類型轉換)
- 用於所有指針的強制轉換
(解讀是指:對要轉換的數據進行重新的解讀)
例如:
int i = 0; char j='c'; int *p1=reinterpret_cast<int *>(&i); char *p2=reinterpret_cast<char *>(&j); //int p3=reinterpret_cast<int >i; //此行錯誤,不能轉換普通數據型