C 型別轉化

2022-03-27 10:33:02 字數 3442 閱讀 1610

dynamic_cast在多繼承中可以判斷無關類之間是否可以轉換,例如基類b1和基類b2之間,static_cast可以在隱式轉化及其逆轉換中進行,但不允許無關型別之間的轉換。,dynamic_cast更多是通過rtti資訊來判斷型別轉換的合理性
c++的四個型別轉換運算子已經有很久了,但一直沒有弄清楚它們的用法,今天看到一本書上的解釋,才大致地的了解了其具體的用法.

具體歸納如下:

reinterpret_cast

該函式將乙個型別的指標轉換為另乙個型別的指標.

這種轉換不用修改指標變數值存放格式(不改變指標變數值),只需在編譯時重新解釋指標的型別就可做到.

reinterpret_cast 可以將指標值轉換為乙個整型數,但不能用於非指標型別的轉換.

例:[cpp]view plain

copy

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

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

該函式用於去除指標變數的常量屬性,將它轉換為乙個對應指標型別的普通變數。反過來,也可以將乙個非常量的指標變數轉換為乙個常指標變數。

這種轉換是在編譯期間做出的型別更改。

例:[cpp]view plain

copy

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;  

出於安全性考慮,const_cast無法將非指標的常量轉換為普通變數。

static_cast

該函式主要用於基本型別之間和具有繼承關係的型別之間的轉換。

這種轉換一般會更改變數的內部表示方式,因此,static_cast應用於指標型別轉換沒有太大意義。

例:[cpp]view plain

copy

//基本型別轉換  

int i=0;  

double d = static_cast(i);  //相當於 double d = (double)i;  

//轉換繼承類的物件為基類物件  

class base{};  

class derived : public base{};  

derived d;  

base b = static_cast(d);     //相當於 base b = (base)d;  

dynamic_cast

它與static_cast相對,是動態轉換。

這種轉換是在執行時進行轉換分析的,並非在編譯時進行,明顯區別於上面三個型別轉換操作。

該函式只能在繼承類物件的指標之間或引用之間進行型別轉換。進行轉換時,會根據當前執行時型別資訊,判斷型別物件之間的轉換是否合法。dynamic_cast的指標轉換失敗,可通過是否為null檢測,引用轉換失敗則丟擲乙個bad_cast異常。

例:[cpp]view plain

copy

class base{};  

class derived : public base{};  

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

derived *pd = new derived;  

base *pb = dynamic_cast(pd);  

if (!pb)  

cout <

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

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

class b{}:  

a* pa = new a;  

b* pb  = dynamic_cast(pa);  

如果對無繼承關係或者沒有虛函式的物件指標進行轉換、基本型別指標轉換以及基類指標轉換為派生類指標,都不能通過編譯。

reinterpret_cast補充

該運算子的用法比較多。

操作符修改了運算元型別,但僅僅是重新解釋了給出的物件的位元模型而沒有進行二進位制轉換。

例如:int *n= new int ;

double *d=reinterpret_cast(n);

在進行計算以後, d 包含無用值. 這是因為 reinterpret_cast 僅僅是複製 n 的位元位到 d, 沒有進行必要的分析。

因此, 需要謹慎使用 reinterpret_cast.

static_cast 與 reinterpret_cast

static_cast和reinterpret_cast的區別主要在於多重繼承,比如12

3456

78910

11classa ;

classb ;

classc :publica,publicb {};

那麼對於以下**:12

c c;

printf("%p, %p, %p", &c,reinterpret_cast(&c),static_cast(&c));

前兩個的輸出值是相同的,最後乙個則會在原基礎上偏移4個位元組,這是因為static_cast計算了父子類指標轉換的偏移量,並將之轉換到正確的位址(c裡面有m_a,m_b,轉換為b*指標後指到m_b處),而reinterpret_cast卻不會做這一層轉換。

因此, 你需要謹慎使用 reinterpret_cast.

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 ...