乙個命名的強制型別轉換具有以下形式:
cast-name(expression);
其中,type是轉換的目標型別,而expression是要轉換的值。如果type是引用型別,則結果是左值。
cast-name是static_cast、dynamic_cast、const_cast、reinterpret_cast中的一種。
static_cast
編譯器在編譯期處理
任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static_cast。例如通過將乙個運算物件強制轉換成double型別就能使表示式執行浮點數除法
double slope = static_cast(j) / i;
當需要把乙個較大的算術型別賦值給較小的型別時,static_cast非常有用。此時,強制型別轉換告訴程式的讀者和編譯器:我們知道並且不在乎潛在的精度損失。一般來說,如果編譯器發現乙個較大的算術型別試圖賦值給較小的型別,就會給出警告資訊;但是當我們執行了顯示型別轉換後,警告資訊就會被關閉。
static_cast對於編譯器無法自動執行的型別轉換也非常有用。例如,我們可以使用static——cast找回存在於void*的指標中的值:
void* p=&d;
double *dp=static_cast(p);
const_cast
編譯器在編譯期處理
const_cast只能改變運算物件的底層const
const char *cp;
char *p=const_cast(cp);
也就是將常量物件轉換成非常量物件。只有const_cast能夠只能改變表示式的常量屬性。
const char *cp;
char *q=static_cast(cp);//錯誤 static_cast不能改變const性質
static_cast(cp);//正確:字串字面值轉換成string型別
const_cast(cp);//錯誤:const_cast只改變常量屬性
reinterpret_cast
編譯器在編譯期處理
reinterpret_cast通常為運算物件的位模式提供較低層次上的重新解釋。
如:int *ip;
char *pc=reinterpret_cast(ip);
我們我們必須牢記pc所指的真實物件是乙個int而非字元,如果pc當成普通字元指標使用就可能在執行時發生錯誤。如:
string str(pc);//可能導致執行時錯誤。
dynamic_cast
在執行期,會檢查這個轉換是否可能
dynamic_cast 操作符,將基類的指標或引用安全的轉換為派生類的指標或引用。
對指標進行dynamic_cast,失敗返回null,成功返回正常cast後的物件指標;
對引用進行dynamic_cast,失敗丟擲乙個異常,成功返回正常cast後的物件引用。
C 顯式型別轉換
對於型別轉換,我在查資料的時候看到了一種很有意思的解釋,我們可以這樣理解型別轉換 某塊記憶體中的資料是不變的,而型別就是我們戴上的眼鏡,當我們戴上一種眼鏡後,我們就會用對應的型別來解釋記憶體中的資料,這樣不同的解釋就得到了不同的資訊。所謂強制型別轉換實際上就是換上另一副眼鏡後再來看同樣的那塊記憶體資...
C 顯式型別轉換
c 的隱式型別轉換不在此文章講述範圍。c 的顯式型別轉換有 4 種 static cast dynamic cast const cast reinterpret cast。語法 cast name expression type 是轉換的目標型別,expression 是要轉換的值。cast na...
C 的顯式型別轉換
c 的顯式型別轉換 顯式型別轉換意味著告訴編譯器 別管我,我已確定要這麼做!編譯器就會相信你,不再做任何其他檢查。所以要小心使用轉換。強制型別轉換容易引發錯誤,所以被認為是一種醜陋的語法。c 中有乙個觀念 醜陋的語法就應該用醜陋的方式表達。所以,c 的轉換操作符使用 x cast 這種一種繁瑣的形式...