###static_cast#函數
任何有明肯定義的類型轉行,只要不包含底層const,均可以用static_cast,用法以下:設計
double b = 10.1; int a = static_const<int>(b); //a=10
當須要把一個較大的算數類型賦值給較小的類型時很是有用,強制類型轉行告訴編譯器:我知道並不在意潛在的精度損失。因而執行了強制類型轉行,編譯器將再也不給出警告信息。指針
static_cast對於編譯器沒法自動執行的類型轉換也頗有用,例如咱們能夠用它找回存在於void*的指針:code
void *p = &c; int *d = static_cast<int*>(p);
但咱們必須確保c就是int類型的指針。對象
###const_cast#字符串
const_cast用於去除底層const。編譯器
const char *a; char *b = const_cast<char*>(a); //正確,可是經過b改變a的值是未定義的
一旦咱們去掉const屬性,編譯器就再也不阻止咱們對a進行寫操做了。若是a對象自己不是一個常量,那麼強制類型裝好得到寫權限是合法的,若是a對象是一個常量,那麼寫操做將產生未定義的後果。string
只有const_cast能改變常量屬性,const_cast不能用於改變表達式類型。編譯
const char *p; char *q = static_cast<char*>(p); //錯誤,static_cast不能用於改變常量屬性 static_cast<string>(p); //正確,將字符串字面值轉換爲string類型 const_cast<string>(p); //錯誤,const_cast只能改變常量屬性
###reinterpret_cast#ast
reinterpret_cast對對象的位模式提供較低層面的從新解釋,例如:
int *a; char *b = reinterpret_cast<char*>(a);
咱們必須記得b所指對象是一個int而不是字符,若是把b當成普通的字符指針將可能在運行時發生錯誤
string c(b);
可能致使異常行爲。
咱們應該儘量減小使用強制類型轉換,在有重載函數的上下文使用const_cast無可厚非,其餘的狀況下使用說明程序存在設計上的缺陷。強制類型轉換干擾了正常的類型檢查,是一種很是危險的行爲。