型別轉換(cast)

爱新觉罗LQ發表於2024-10-07

型別轉換

1. static_cast(靜態轉換)

編譯的時候就會進行型別轉換,程式碼中要保證轉換的安全性和正確性
可用於:

  • 相關型別轉換,比如:整型和實型之間的轉換
  • 子型別轉成父類型別(向上轉型)
  • void * 與其它型別指標之間的轉換(void *:無指標型別,可以指向任何指標型別(萬能指標))
double f = 100.34f;
int j = static_cast<int>(f);

class A {}
class B : public A{}
B b;
A a = static_cast<A>(b);  //  把子類轉成父類的物件

//  萬能指標
int i = 10;
int *p = &i;
void * q = static_cast<void *>(p);  //  int * 轉成 void *
int * db = static_cast<int *>(q);

2. dynamic_cast(第三章第十節)

3. const_cast

去除指標 或者引用的 const 屬性。該轉換能夠將 const 效能轉換掉,編譯時就會進行型別轉換

const int a = 10;
// int b = const_cast<int *>(a); a 既不是指標,也不是引用,不能轉
const int *pa = &a;
int * pa2 = const_cast<int *>(pa);  //  語法正確
*pa2 = 120;  //  這種寫值行為,是屬於一種未定義行為,不要這麼做

4. reinterpret_cast(不建議使用)

重新解釋:將運算元內容解釋為另一種不同的型別【能把運算元的型別都轉了】
處理無關型別的轉換:也就是2個轉換型別之間沒有什麼關係,就等於可以亂轉,自由轉,怎麼轉都行,很隨意
常用於如下兩種轉換:

  1. 將一個整型(地址)轉換成指標,一種型別指標轉換成另一種型別指標,按照轉換後的內容重新解釋記憶體中的內容
  2. 也可以從一個指標型別轉換成一個整型
int i = 10;
int *pi = &i;
int *p2 = reinterpret_cast<int *>(&i);
int *pc = reinterpret_cast<char *>(pi);

相關文章