c++中四種強制轉換符分別為:const_cast, static_cast, dynamic_cast, reinterpret_cast;在c++中這是乙個很常見的話題,特別是對於新人。然後就……
一般來說,在型別轉換中會出現以下幾種情況:
- int 轉換 float:常出現在數學計算中,比如:提高計算的精度等;
- int 轉換 enum:列舉常用於表意,而實際參與計算的仍是int型別;
- int 和 指標互**試圖根據某個成員變數的偏移位計算其在該物件記憶體空間位置時,就會需要將指標轉換為整型進行計算。當計算出該變數的位置後(整型),就需要將其轉換為指標型別。
- 有型別指標和無型別指標:
- 轉換不同長度的資料:擷取資料的問題;
- 存在繼承關係的類指標轉換:多用於多型場景中;
- 無繼承關係的類指標轉換:不是特別常用
在測試上面的其中情況時,我們會出現一下問題:
1、編譯器出錯。這是因為語法規定這種使用不合法。所以編譯器在編譯**時,認為該行為違法,終止之後的流程。
2、執行時出錯。這是因為在語法上是合法的,但是執行時是不合理的。
下面,我們主要講述const_cast, static_cast, dynamic_cast, reinterpret_cast四種強制轉換符的區別:
1. static_cast
是最常用的型別的轉換符,如下所示:
int i;
float f = 3.28;
i = static_cast
(f);
2. const_cast
看見const不要認為是將其長量化,而是恰恰相反;其作用是取出變數的const屬性,把const型別的指標變為非const型別的指標;如下所示:
const
int *fun(int a, int b){}
intconst_cast
(fun(1, 2));
3. dynamic_cast
主要用於執行時檢查該型別轉換是否符合型別安全,但只在多型型別中使用時合法的,即該類中至少有乙個virtual。
4. reinterpret_cast
其中reinterpret的中文意思是「重新解釋」;而在熱interpret_cast中表示資料的二進位制形式重新解釋,但是該二進位制的值是不會被改變的。如下所示:
int i;
char *ptr = "i love you!!!";
int i = reinterpret_cast
(ptr);
下面用**代替前面的幾種情況:
//指標轉換整型
int a = dynamic_cast
(int *p);
//整型轉換指標
int *p = dynamic_cast
(int a);
//整型轉換浮點型
float a = dynamic_cast
(int a);
//浮點型轉換整型
int a = dynamic_cast
(float);
//型別指標轉換無型別指標
void *p = dynamic_cast
(int *p1);
//無型別指標轉換型別指標
int *p = dynamic_cast
(void *p);
//整型轉換列舉
type t = dynamic_cast
(int a);
//列舉轉換整型
int a = dynamic_cast
(type t);
//無型別指標轉換整型
int a = dynamic_cast
(void *p);
//無型別指標轉換其他指標
other *p = dynamic_cast
(void *pv);
c 四種強制轉換
c 同時提供了四種新的強制轉型形式 通常稱為新風格的或 c 風格的強制轉型 const cast expression dynamic cast expression reinterpret cast expression static cast expression 每一種適用於特定的目的 con...
C 四種強制轉換
c 的四種強制型別轉換,所以c 不是型別安全的。分別為 static cast dynamic cast const cast reinterpret cast 為什麼使用c風格的強制轉換可以把想要的任何東西轉換成合乎心意的型別。那為什麼還需要乙個新的c 型別的強制轉換呢?新型別的強制轉換可以提供更...
C 四種強制轉換
c 的四種強制型別轉換,所以c 不是型別安全的。分別為 static cast dynamic cast const cast reinterpret cast。為什麼使用c風格的強制轉換可以把想要的任何東西轉換成合乎心意的型別。那為什麼還需要乙個新的c 型別的強制轉換呢?新型別的強制轉換可以提供更...