C 型別轉化

2022-03-19 08:34:57 字數 2288 閱讀 3032

reinterpret_cast用在任意指標(或引用)型別之間的轉化,以及指標與足夠大的整數型別之間的轉化,從整數型別(包括列舉型別)到指標型別,無視大小。

作用及原理:將乙個型別的指標,轉換為另乙個型別的指標,這種轉換不用修改指標變數值資料存放格式(不改變指標變數值),只需在編譯時重新解釋指標的型別就可以,當然他也可以將指標轉換成整型值,但不能做非指標型別轉換

#include#include

using

namespace

std;

intmain()

;

class

b{};

a* pa = new

a; b* pb = reinterpret_cast(pa);

//poniter convertedto integer

long j = reinterpret_cast(pi);

return0;

}

const_cast

作用及原理:用於去除指標變數的常量屬性,將它轉換為乙個對應的指標型別的普通變數,當然,也可以將乙個非常量的指標變數轉換為乙個常指標變數。這種轉換在編譯期間。

#include#include

using

namespace

std;

intmain()

static_cast

作用原理:主要用於基本型別之間和具有繼承關係的型別之間的轉換。

#include#include

using

namespace

std;

intmain()

;

class derived:public

base{};

derived d;

base b=static_cast(d);//

將子類物件賦值給父類物件

return0;

}

dynamic_cast

作用及其原理:dynamic_cast轉換是動態轉換,這種轉換是在執行時進行轉換分析,而不是在編譯時期進行,這是區別以上三種轉化的一處。

dynamic_cast只能在繼承類物件的指標之間或引用之間進行轉換,進行轉換時,會根據當前執行物件的執行型別資訊(rtti),判斷型別物件之間的轉換是否合法。dynamic_cast的指標轉換失敗,可通過是否為null指標來檢測。

#include#include

using

namespace

std;

intmain()

;

class derived:public

base{};

derived* pd = new derived; //

子類指標轉化為父類指標

base* pc = dynamic_cast(pd);

if(!pc)

else

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

class a}; //

有虛函式

class

b{};

a* pa = new

a; b* pb = dynamic_cast(pa);

if (!pb)

else

return0;

}

執行結果:

ubuntu@ubuntu:~/wangqinghe/c++/20200120$ g++ dynamic_cast.cpp -o dynamic_cast

ubuntu@ubuntu:~/wangqinghe/c++/20200120$ ./dynamic_cast

converted success

converted error. incldue virtual

沒有繼承關係的類之間轉換,如果轉換的類中有虛函式,編譯器會通過,但是轉化失敗。

總結:

reinterpret_cast    適用於指標轉換為另一種指標。允許將任何指標型別轉換為其他型別。

const_cast     適用於常指標變數,可以使指標變數變為非常指標變數。

static_cast     主要用於基本型別轉換和擁有繼承關係變數之間的轉換。

dynamic_cast 只能在繼承物件的指標之間或引用之間進行型別轉換。

主要:標頭檔案包含在#include中。

C 型別轉化

c 型別轉化 在理解c 型別轉換前,我們先回顧c語言中型別轉換。c風格的強制型別轉化很簡單,不管什麼型別轉換統統是 type b type a。但是c風格的型別轉換有不少的缺點,有的時候用c風格的轉換是不合適的,因為它可以在任意型別之間轉換,比如你可以把乙個指向const物件的指標轉換成指向非con...

c 型別轉化

資料型別轉換 隱式轉換 int age 10 double sum age int salary 150000 decimal money salary double speed 10.4f float minspeed float speed string num 123 int n int.pa...

C 型別轉化

const char a 必須const 因為 hello 存在常量區,為唯讀 string str hello str 1 s pass a str.c str a 1 s fail 報錯 唯讀,指標指向常量區char a a 11 int b atoi a cout string str to ...