提供const與非const的轉換,且只能用在參照和指針上,如
const string s = "Inception";
string& p = const_cast <string&> (s);
string* ps = const_cast <string*> (&s);
注意const轉非const,只是爲了名義上的const轉換,比如要函數傳參把const物件傳進非const屬性參數裡,但是實際上轉換完的也是不可以修改的,因爲如果原本的指向是ROM上的空間,那當然是不能修改的
一種用法是就像C語言中的(double*),代替了C語言這種強制轉換的用法,;另一種用法是對於類指針的轉換,編譯時期它會檢查是否是一個繼承鏈上的,不是則報錯,而就算是統一繼承鏈,還有一種情況會導致執行時的錯誤,見dynamic_cast;
static_cast不是真正意義上的強制轉換,一些不安全的編譯器還是會報錯,比如整型和指針的轉換,這個就要看reinterpret了
是用作在繼承鏈上的父子類轉換,,子類向上轉換一般是安全的,父類別向下如果用static_cast,即強制轉換,可能會導致父類別指針指向子類定義的而父類別沒有的函數,會導致執行時候的錯誤,而dynamic_cast就提供了在執行時候的檢查,但是這種轉換執行比較耗時
算是真正意義上的強制轉換,把原始空間用新的型別來解釋,而不修改任何東西,而static_cast如果是父轉子指針,會修正指針指向位置,就像下面 下麪這個圖,可以想象在編譯過程中,這段語句會被編譯器多加一句pc指針位置的變換;
reinterpret_cast的一種作用是讓this列印出值來