C 的四種型別轉換方式

2021-09-25 10:38:00 字數 1910 閱讀 3500

int a = 10;

double d = static_casta;

static_cast:用於基本型別繼承關係的轉換,更改變數內部表示(最常用)

reinsterpret_cast:將指標解釋為另一種指標,不修改指標指向的資料(指標)

const_cast:去除const

dynamic_cast:繼承類物件的指標或引用的轉換(執行時)

一,stcti_cast

用於基本型別和繼承關係的轉換,更改變數內部表示。

static_cast允許執行任意的隱式轉換和相反轉換動作

相反轉換動作:更改變數內部表示

int a = 10;

double c = static_casta;//基本型別的轉換

class base ;

class derived :public based;

base *a = new base;

derived *b = static_cast(derived) a;//繼承關係的轉換

二,reinterpret_cast

指標解釋為另一種指標,不修改指標指向的資料。

只能作用於指標。

這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。

//基本型別指標的型別轉換

double d=9.2;

double* pd = &d;

int *pi = reinterpret_cast(pd); //相當於int *pi = (int*)pd;

//不相關的類的指標的型別轉換

class a{};

class b{};

a* pa = new a;

b* pb = reinterpret_cast(pa); //相當於b* pb = (b*)pa;

//指標轉換為整數

long l = reinterpret_cast(pi); //相當於long l = (long)pi;

三,const_cast

↵去除或新增常量屬性

const int* pci = 0;

int* pk = const_cast(pci); //相當於int* pk = (int*)pci;

const a* pca = new a;

a* pa = const_cast(pca); //相當於a* pa = (a*)pca;

四,dynamic_cast

繼承類物件的指標或引用的轉換。

與其他3種不同的是:這種轉換是在執行時進行轉換分析的,其他3種在編譯時進行。

轉換是否失敗,可通過是否為null檢測,引用轉換失敗則丟擲乙個bad_cast異常。

class base{};

class derived : public base{};

//派生類指標轉換為基類指標

derived *pd = new derived;

base *pb = dynamic_cast(pd);

if (!pb)

cout << "型別轉換失敗" << endl;

//沒有繼承關係,但被轉換類有虛函式

class a(virtual ~a();) //有虛函式

class b{}:

a* pa = new a;

b* pb = dynamic_cast(pa);

C 四種型別轉換方式

c風格的強制型別轉換 type case 很簡單,不管什麼型別的傳統轉換都是 type b type a,但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間進行轉換,比如你可以把乙個指向const型別的指標轉換成指向非const型別的指標,把乙個指向基類物件...

C 四種型別轉換方式

reinterpert cast意圖執行低階轉換,實際動作 及結果 可能取決於編譯器,這也就表示它不可移植。例如將乙個 pointer to int 轉型為乙個 int 這一型別在底層 以外很少見。示例 class a class b a a new a b b reinterpret a rein...

C 四種型別轉換方式

static cast 靜態型別轉換。reinterpreter cast 重新解釋型別轉換。dynamic cast 子類和父類之間的多型型別轉換。const cast 去掉const屬性轉換 這應該四種中是最常見的。用法為 static cast expression 該運算子把 express...