C++語言雖然兼容C,也支持C語言的類型轉換用法,就是將類型用圓括號括起來,這種轉換可視性比較差,難以跟蹤錯誤的轉換。C++提供了命名的強制轉換操作符,畢竟轉換有時是不安全的,所以使用命名轉換操作符可以根據所使用的轉換操作符可以判斷風險級別。
下面我們就來看看C++提供的四種命名的強制轉換操作符的具體功能和用法。
1.const_cast
2.static_cast
3.reinterpret_cast
4.dynamic_cast
這四個操作符的使用方法是相同的,都是cast-name<Type>(expression),Type是被轉換值expression的目標類型。
下面看看這四個操作符分別的應用場合。
1.const_cast
顧名思義,const_cast就是將表達式的const性質去掉,例如
[cpp]
char* string_copy(char* s)
{
return s;
}
int main()
{
const char* pc_str;
char* pc = string_copy(const_cast<char*>(pc_str));//如直接傳入pc_str則編譯錯誤
return 0;
}
上例只是說明問題,並不實現功能。
要記住,const_cast只能用來添加或刪除const特性,同時添加或刪除特性也只能用const_cast。
2.static_cast
這個用途比較廣泛,編譯器隱式執行的任何類型轉換都可以有static_cast完成。
另外,static_cast多用於將一個void*類型的指針強制轉換為原來的指針類型,例如:
[cpp]
double d = 12;
void* p = &d;
double* pd = static_cast<double*>(p);
cout << *pd << endl;
輸出結果為12,說明轉換後依然還是指向同一個地址。
3.reinterpret_cast
這個操作符很難看,也很難記,為什麼呢,因為危險性比較大,設計成這個樣子就是為了讓我們盡量不用它,它用於對指針之間進行轉換,例如:
[cpp]
int* ip;
char* pc = reinterpret_cast<char*>(ip);
string str(pc);
雖然可以編譯通過,但是卻會帶來嚴重的運行時錯誤,所以,要盡量避免reinterpret_cast的使用。
4.dynamic_cast
dynamic_cast用於子類和父類之間的轉換,它可以將父類的指針或引用轉換為子類的指針或引用。
dynamic_cast與前三種強制轉換不同,它涉及運行時類型檢查。如果綁定到引用或指針的類型對象不是目標類型的對象時,則dynamic_cast失敗。當用於指針的轉換失敗時,dynamic_cast的結果為0,用於引用的轉換失敗時,則拋出一個bad_cast異常。
可用下面例子所用的結構對轉換進行檢測:
指針轉換:
[cpp]
if(Derived *derviedPtr = dynamic_cast<Derived*>(basePtr){
// use the Derived object to which derivedPtr points
}
else{
// basePtr oiubsts at a Base object
// use the Base object to which basePtr points
}
引用轉換:
[cpp]
void f(const Base& b)
{
try{
const Derived& d = dynamic_cast<const Derived&>(b);
// use the Derived object to which b referred
}
catch (bad_cast){
// handle the fact that the cast failed
}
}
至此,轉換操作符介紹完畢。