C 中四種強制轉換符

2021-08-03 02:15:40 字數 1995 閱讀 3360

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 型別的強制轉換呢?新型別的強制轉換可以提供更...