C++顯式類型轉換
阿新 • • 發佈:2018-02-02
動作 primer 我們 ble ons 出錯 blog gre rtti 。
的實際動作與編譯器具體實現密切相關,可能會產生無法意料的錯誤,並且降低程序的可移植性,本文的參考書目不建議過多使用。
C++顯式類型轉換
(註:本文例程改編自《C++ Primer》)
關於類型轉換,C++保留了C語言中的類型轉換方式,並提供了4中新的類型轉換方式。《Effective C++》鼓勵我們使用新的轉換方式:
第一,它們很容易在代碼中被識別出來(不論是人工辨識或使用工具如grep),因而得以簡化“找出類型系統在哪個地點被破壞”的過程。第二,各轉型動作的目標愈窄化,編譯器愈可能診斷出錯誤的運用。舉個例子,如果你打算將常量性去掉,除非使用新式轉型中的const_cast否則無法通過編譯。
四類顯式類型轉換
static_cast
static_cast
用於對對象進行強制的類型轉換,但要求對象不是底層上的常量(指針常量為頂層常量,指針指向內容為常量即底層常量)
int i = 2, j = 1;
double dval = static_cast<double>(j) / i;
另外static_cast
還可以用於對編譯器無法自動執行的類型轉換,如:
double dval;
void *p = &dval;
double *dp = static_cast<double*>(p);
const_cast
const_cast
用於移除const對象的常量性質,並且C++中只有const_cast
這一類型轉換方式可以做到這一點。移除對象的常量性是合法的,但是移除後對常量對象進行寫操作會產生未定義後果。
示例:
const char *cp;
char *q = static_cast<char*>(cp); // 錯誤:static_cast不能移除常量性
static_cast<string>(cp); // 正確
const_cast<string>(cp); // 錯誤:const_cast只能用於移除常量性,不能進行強制類型轉換
reinterpret_cast
reinterpret_cast
會執行位數據上的底層類型轉換操作,顧名思義是一種“重新解釋”。
示例:
int *ip;
char *pc = reinterpret_cast<char*>(ip);
然而需要註意的是,reinterpret_cast
dynamic_cast
該轉換方式與RTTI密切相關,後續將進行補充。
參考書目
- 《C++ Primer》中文第五版
- 《Effective C++》中文第三版
C++顯式類型轉換