再探C++Primer(7) 顯式類型轉換

###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無可厚非,其餘的狀況下使用說明程序存在設計上的缺陷。強制類型轉換干擾了正常的類型檢查,是一種很是危險的行爲。

相關文章
相關標籤/搜索