_cast
字串就可以了。甚至可以根據錯誤的型別,有針對性地專門查詢某一種強制型別轉換。例如,懷疑一個錯誤可能是由於使用了 reinterpret_cast 導致的,就可以只查詢reinterpret_cast
字串。強制型別轉換運算子 <要轉換到的型別> (待轉換的表示式)
例如:double d = static_cast <double> (3*5); //將 3*5 的值轉換成實數
下面分別介紹四種強制型別轉換運算子。#include <iostream> using namespace std; class A { public: operator int() { return 1; } operator char*() { return NULL; } }; int main() { A a; int n; char* p = "New Dragon Inn"; n = static_cast <int> (3.14); // n 的值變為 3 n = static_cast <int> (a); //呼叫 a.operator int,n 的值變為 1 p = static_cast <char*> (a); //呼叫 a.operator char*,p 的值變為 NULL n = static_cast <int> (p); //編譯錯誤,static_cast不能將指標轉換成整型 p = static_cast <char*> (n); //編譯錯誤,static_cast 不能將整型轉換成指標 return 0; }
#include <iostream> using namespace std; class A { public: int i; int j; A(int n):i(n),j(n) { } }; int main() { A a(100); int &r = reinterpret_cast<int&>(a); //強行讓 r 參照 a r = 200; //把 a.i 變成了 200 cout << a.i << "," << a.j << endl; // 輸出 200,100 int n = 300; A *pa = reinterpret_cast<A*> ( & n); //強行讓 pa 指向 n pa->i = 400; // n 變成 400 pa->j = 500; //此條語句不安全,很可能導致程式崩潰 cout << n << endl; // 輸出 400 long long la = 0x12345678abcdLL; pa = reinterpret_cast<A*>(la); //la太長,只取低32位元0x5678abcd拷貝給pa unsigned int u = reinterpret_cast<unsigned int>(pa);//pa逐個位元拷貝到u cout << hex << u << endl; //輸出 5678abcd typedef void (* PF1) (int); typedef int (* PF2) (int,char *); PF1 pf1; PF2 pf2; pf2 = reinterpret_cast<PF2>(pf1); //兩個不同型別的函數指標之間可以互相轉換 }程式的輸出結果是:
const string s = "Inception"; string& p = const_cast <string&> (s); string* ps = const_cast <string*> (&s); // &s 的型別是 const string*
#include <iostream> #include <string> using namespace std; class Base { //有虛擬函式,因此是多型基礎類別 public: virtual ~Base() {} }; class Derived : public Base { }; int main() { Base b; Derived d; Derived* pd; pd = reinterpret_cast <Derived*> (&b); if (pd == NULL) //此處pd不會為 NULL。reinterpret_cast不檢查安全性,總是進行轉換 cout << "unsafe reinterpret_cast" << endl; //不會執行 pd = dynamic_cast <Derived*> (&b); if (pd == NULL) //結果會是NULL,因為 &b 不指向派生類物件,此轉換不安全 cout << "unsafe dynamic_cast1" << endl; //會執行 pd = dynamic_cast <Derived*> (&d); //安全的轉換 if (pd == NULL) //此處 pd 不會為 NULL cout << "unsafe dynamic_cast2" << endl; //不會執行 return 0; }程式的輸出結果是:
Derived & r = dynamic_cast <Derived &> (b);
那該如何判斷該轉換是否安全呢?不存在空參照,因此不能通過返回值來判斷轉換是否安全。C++ 的解決辦法是:dynamic_cast 在進行參照的強制轉換時,如果發現轉換不安全,就會拋出一個異常,通過處理異常,就能發現不安全的轉換。