cpp11的幾種cast淺析

2020-08-10 10:35:15

const_cast

提供const與非const的轉換,且只能用在參照和指針上,如

const string s = "Inception"; 
string& p = const_cast <string&> (s); 
string* ps = const_cast <string*> (&s);

注意const轉非const,只是爲了名義上的const轉換,比如要函數傳參把const物件傳進非const屬性參數裡,但是實際上轉換完的也是不可以修改的,因爲如果原本的指向是ROM上的空間,那當然是不能修改的

static_cast

一種用法是就像C語言中的(double*),代替了C語言這種強制轉換的用法,;另一種用法是對於類指針的轉換,編譯時期它會檢查是否是一個繼承鏈上的,不是則報錯,而就算是統一繼承鏈,還有一種情況會導致執行時的錯誤,見dynamic_cast;

static_cast不是真正意義上的強制轉換,一些不安全的編譯器還是會報錯,比如整型和指針的轉換,這個就要看reinterpret了

dynamic_cast

是用作在繼承鏈上的父子類轉換,,子類向上轉換一般是安全的,父類別向下如果用static_cast,即強制轉換,可能會導致父類別指針指向子類定義的而父類別沒有的函數,會導致執行時候的錯誤,而dynamic_cast就提供了在執行時候的檢查,但是這種轉換執行比較耗時

reinterpret_cast

算是真正意義上的強制轉換,把原始空間用新的型別來解釋,而不修改任何東西,而static_cast如果是父轉子指針,會修正指針指向位置,就像下面 下麪這個圖,可以想象在編譯過程中,這段語句會被編譯器多加一句pc指針位置的變換;

reinterpret_cast的一種作用是讓this列印出值來

 

參考資料

  1. https://blog.csdn.net/chenlycly/article/details/38713981將幾種作用的
  2. static_cast 和 reinterpret_cast 有什麼不同?https://www.zhihu.com/question/46470823上面的圖也在這
  3. https://blog.csdn.net/bajianxiaofendui/article/details/86616256

TODO

  1. https://blog.csdn.net/TanJiaLiang_/article/details/83992337講const_cast的
  2. https://stackoverflow.com/questions/357600/is-const-cast-safe是否安全const_cast