1.將其餘類型轉換爲當前類類型須要藉助轉換構造函數。html
具體看例子:點擊ios
1.將當前類類型轉換爲其餘類型,只能出如今類中。express
2.語法格式:數組
operator type(){ //TODO: return data; }
operator 是 C++ 關鍵字,type 是要轉換的目標類型,data 是要返回的 type 類型的數據。安全
具體點擊ide
具體點擊函數
類型轉換的本質spa
具體點擊.net
static_cast dynamic_cast const _cast和reinterpret_cast指針
關鍵字 | 說明 |
---|---|
static_cast | 用於良性轉換,通常不會致使意外發生,風險很低。 |
const_cast | 用於 const 與非 const、volatile 與非 volatile 之間的轉換。 |
reinterpret_cast | 高度危險的轉換,這種轉換僅僅是對二進制位的從新解釋,不會藉助已有的轉換規則對數據進行調整,可是能夠實現最靈活的 C++ 類型轉換。 |
dynamic_cast | 藉助 RTTI,用於類型安全的向下轉型(Downcasting)。 |
1.static_cast 只能用於良性轉換,這樣的轉換風險較低,通常不會發生什麼意外,例如:
void *
轉int *
、char *
轉void *
等;
須要注意的是,static_cast 不能用於無關類型之間的轉換,由於這些轉換都是有風險的,例如:
int *
轉double *
、Student *
轉int *
等。不一樣類型的數據存儲格式不同,長度也不同,用 A 類型的指針指向 B 類型的數據後,會按照 A 類型的方式來處理數據:若是是讀取操做,可能會獲得一堆沒有意義的值;若是是寫入操做,可能會使 B 類型的數據遭到破壞,當再次以 B 類型的方式讀取數據時會獲得一堆沒有意義的值。
1 #include <iostream> 2 #include <cstdlib> 3 using namespace std; 4 5 class Complex{ 6 public: 7 Complex(double real = 0.0, double imag = 0.0): m_real(real), m_imag(imag){ } 8 public: 9 operator double() const { return m_real; } //類型轉換函數 10 private: 11 double m_real; 12 double m_imag; 13 }; 14 15 int main(){ 16 //下面是正確的用法 17 int m = 100; 18 Complex c(12.5, 23.8); 19 long n = static_cast<long>(m); //寬轉換,沒有信息丟失 20 char ch = static_cast<char>(m); //窄轉換,可能會丟失信息 21 int *p1 = static_cast<int*>( malloc(10 * sizeof(int)) ); //將void指針轉換爲具體類型指針 22 void *p2 = static_cast<void*>(p1); //將具體類型指針,轉換爲void指針 23 double real= static_cast<double>(c); //調用類型轉換函數 24 25 //下面的用法是錯誤的 26 float *p3 = static_cast<float*>(p1); //不能在兩個具體類型的指針之間進行轉換 27 p3 = static_cast<float*>(0X2DF9); //不能將整數轉換爲指針類型 28 29 return 0; 30 }
將const類型轉換爲非const類型
1 #include <iostream> 2 using namespace std; 3 4 int main(){ 5 const int n = 100; 6 int *p = const_cast<int*>(&n); 7 *p = 234; 8 cout<<"n = "<<n<<endl; 9 cout<<"*p = "<<*p<<endl; 10 11 return 0; 12 }
運行結果:
n = 100;
*p = 234;
&n
用來獲取 n 的地址,它的類型爲const int *
,必須使用 const_cast 轉換爲int *
類型後才能賦值給 p。因爲 p 指向了 n,而且 n 佔用的是棧內存,有寫入權限,因此能夠經過 p 修改 n 的值。
有讀者可能會問,爲何經過 n 和 *p 輸出的值不同呢?這是由於 C++ 對常量的處理更像是編譯時期的#define
,是一個值替換的過程,代碼中全部使用 n 的地方在編譯期間就被替換成了 100。換句話說,第 8 行代碼被修改爲了下面的形式:
cout<<"n = "<<100<<endl;
1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 A(int a = 0, int b = 0): m_a(a), m_b(b){} 7 private: 8 int m_a; 9 int m_b; 10 }; 11 12 int main(){ 13 //將 char* 轉換爲 float* 14 char str[]="http://c.biancheng.net"; 15 float *p1 = reinterpret_cast<float*>(str); 16 cout<<*p1<<endl; 17 //將 int 轉換爲 int* 18 int *p = reinterpret_cast<int*>(100); 19 //將 A* 轉換爲 int* 20 p = reinterpret_cast<int*>(new A(25, 96)); 21 cout<<*p<<endl; 22 23 return 0; 24 }
dynamic_用於類的繼承層次進行類型轉換,容許向上轉型,也容許向下轉型。向上轉型無檢測,向下轉型需經rtti進行檢測,只有部分紅功。
語法格式:
dynamic_cast<newType>(rxpression)
newType 和 expression 必須同時是指針類型或者引用類型。換句話說,dynamic_cast 只能轉換指針類型和引用類型,其它類型(int、
double、數組、類、結構體等)都不行。