C++ 強制類型轉換

  • static_cast,是一個強制類型轉換操作符。編譯器隱式執行的任何類型轉換都可以由static_cast來完成,比如int與float、double與char、enum與int之間的轉換等。
char a = 'a';
int b = static_cast<int>(a);//正確,將char型數據轉換成int型數據

double *c = new double;
void *d = static_cast<void*>(c);//正確,將double指針轉換成void指針

int e = 10;
const int f = static_cast<const int>(e);//正確,將int型數據轉換成const int型數據

const int g = 20;
int *h = static_cast<int*>(&g);//編譯錯誤,static_cast不能轉換掉g的const屬性
  • const_cast,用於修改類型的const或volatile屬性。
const int g = 20;
int *h = const_cast<int*>(&g);//去掉const常量const屬性

const int g = 20;
int &h = const_cast<int &>(g);//去掉const引用const屬性

const char *g = "hello";
char *h = const_cast<char *>(g);//去掉const指針const屬性
  • reinterpret_cast,可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,再把該整數轉換成原類型的指針,還可以得到原先的指針值)。reinterpret_cast意圖執行低級轉型,實際動作(及結果)可能取決於編輯器,這也就表示它不可移植。錯誤的使用reinterpret_cast很容易導致程序的不安全,只有將轉換後的類型值轉換回到其原始類型,這樣纔是正確使用reinterpret_cast方式。
float f =  -12.4545;
unsigned char* p = reinterpret_cast<unsigned char*>(&f);
  • dynamic_cast,主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換(cross cast)
    dynamic_cast<type*>(e)
    dynamic_cast<type&>(e)
    dynamic_cast<type&&>(e)
    type必須是一個類類型,在第一種形式中,type必須是一個有效的指針,在第二種形式中,type必須是一個左值,在第三種形式中,type必須是一個右值。在上面所有形式中,e的類型必須符合以下三個條件中的任何一個:e的類型是是目標類型type的公有派生類、e的類型是目標type的共有基類或者e的類型就是目標type的的類型。如果一條dynamic_cast語句的轉換目標是指針類型並且失敗了,則結果爲0。如果轉換目標是引用類型並且失敗了,則dynamic_cast運算符將拋出一個std::bad_cast異常(該異常定義在typeinfo標準庫頭文件中)。e也可以是一個空指針,結果是所需類型的空指針。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章