1. 程式人生 > >C++顯式類型轉換

C++顯式類型轉換

動作 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密切相關,後續將進行補充。

參考書目

  1. 《C++ Primer》中文第五版
  2. 《Effective C++》中文第三版

C++顯式類型轉換