c++ 顯式類型轉換

一個命名的強制類型轉換具有以下形式:
cast-name<type>(expression);
其中,type是轉換的目標類型,而expression是要轉換的值。如果type是引用類型,則結果是左值。
cast-name是static_cast、dynamic_cast、const_cast、reinterpret_cast中的一種。


static_cast

編譯器在編譯期處理 任何具有明確定義的類型轉換,只要不包含底層const,都可以使用static_cast。例如通過將一個運算對象強制轉換成double類型就能使表達式執行浮點數除法
double slope = static_cast<double>(j) / i;
當需要把一個較大的算術類型賦值給較小的類型時,static_cast非常有用。此時,強制類型轉換告訴程序的讀者和編譯器:我們知道並且不在乎潛在的精度損失。一般來說,如果編譯器發現一個較大的算術類型試圖賦值給較小的類型,就會給出警告信息;但是當我們執行了顯示類型轉換後,警告信息就會被關閉。
static_cast對於編譯器無法自動執行的類型轉換也非常有用。例如,我們可以使用static——cast找回存在於void*的指針中的值:
void* p=&d;
double *dp=static_cast<double*>(p);

const_cast

編譯器在編譯期處理
const_cast只能改變運算對象的底層const
const char *cp;
char *p=const_cast<char*>(cp);
也就是將常量對象轉換成非常量對象。只有const_cast能夠只能改變表達式的常量屬性。
const char *cp;
char *q=static_cast<char*>(cp);//錯誤 static_cast不能改變const性質
static_cast<string>(cp);//正確:字符串字面值轉換成string類型
const_cast<string>(cp);//錯誤:const_cast只改變常量屬性

reinterpret_cast

編譯器在編譯期處理
reinterpret_cast通常爲運算對象的位模式提供較低層次上的重新解釋。
如:
int *ip;
char *pc=reinterpret_cast<char *>(ip);
我們我們必須牢記pc所指的真實對象是一個int而非字符,如果pc當成普通字符指針使用就可能在運行時發生錯誤。如:
string str(pc);//可能導致運行時錯誤。

dynamic_cast


在運行期,會檢查這個轉換是否可能
dynamic_cast 操作符,將基類的指針或引用安全的轉換爲派生類的指針或引用。
對指針進行dynamic_cast,失敗返回null,成功返回正常cast後的對象指針; 
    對引用進行dynamic_cast,失敗拋出一個異常,成功返回正常cast後的對象引用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章