c++的四個型別轉換運算子已經有很久了,但一直沒有弄清楚它們的用法,今天看到一本書上的解釋,才大致地的了解了其具體的用法.
具體歸納如下:
reinterpret_cast
該函式將乙個型別的指標轉換為另乙個型別的指標.
這種轉換不用修改指標變數值存放格式(不改變指標變數值),只需在編譯時重新解釋指標的型別就可做到.
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;
出於安全性考慮,const_cast無法將非指標的常量轉換為普通變數。
static_cast
該函式主要用於基本型別之間和具有繼承關係的型別之間的轉換。
這種轉換一般會更改變數的內部表示方式,因此,static_cast應用於指標型別轉換沒有太大意義。
例://基本型別轉換
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異常。
例: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 的四個型別轉換運算子已經有很久了,但一直沒有弄清楚它們的用法,今天看到一本書上的解釋,才大致地的了解了其具體的用法.具體歸納如下 reinterpret cast 該函式將乙個型別的指標轉換為另乙個型別的指標.這種轉換不用修改指標變數值存放格式 不改變指標變數值 只需在編譯時重新解釋指標的型別就...
C 型別轉換運算子的使用
c 提供了四個新的型別轉換運算子 const cast dynamic cast reinterpret cast static cast 使用方法 cast operator object 型別轉換操作符 要轉換的型別 要進行轉換的物件 dynamic cast 將乙個基類引用或指標轉換位乙個派生...
c 型別轉換運算子
c 中有4個型別轉換運算子,使裝換過程更規範 dynamic cast type name expression 如果轉型失敗則返回0,即空指標。該運算子的用途是,使得能夠在類層次結構中進行向上轉換 由於 is a關係,這樣的型別轉換時安全的 而不允許其他轉換。二 const cast const ...