面向對象進階--轉換構造函數,重載,類型轉換函數

轉換構造函數

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)。

 

static_cast關鍵字

1.static_cast 只能用於良性轉換,這樣的轉換風險較低,通常不會發生什麼意外,例如:

  • 原有的自動類型轉換,例如 short 轉 int、int 轉 double、const 轉非 const、向上轉型等;
  • void 指針和具體類型指針之間的轉換,例如void *int *char *void *等;
  • 有轉換構造函數或者類型轉換函數的類與其它類型之間的轉換,例如 double 轉 Complex(調用轉換構造函數)、Complex 轉 double(調用類型轉換函數)。


須要注意的是,static_cast 不能用於無關類型之間的轉換,由於這些轉換都是有風險的,例如:

  • 兩個具體類型指針之間的轉換,例如int *double *Student *int *等。不一樣類型的數據存儲格式不同,長度也不同,用 A 類型的指針指向 B 類型的數據後,會按照 A 類型的方式來處理數據:若是是讀取操做,可能會獲得一堆沒有意義的值;若是是寫入操做,可能會使 B 類型的數據遭到破壞,當再次以 B 類型的方式讀取數據時會獲得一堆沒有意義的值。
  • int 和指針之間的轉換。將一個具體的地址賦值給指針變量是很是危險的,由於該地址上的內存可能沒有分配,也可能沒有讀寫權限,剛好是可用內存反而是小几率事件。

 

 

 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 }
View Code

 

const_cast關鍵字

將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;

 

reinterpret_cast關鍵字

 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 }
View Code

 

dynamic_cast關鍵字

dynamic_用於類的繼承層次進行類型轉換,容許向上轉型,也容許向下轉型。向上轉型無檢測,向下轉型需經rtti進行檢測,只有部分紅功。

語法格式:

dynamic_cast<newType>(rxpression)

newType 和 expression 必須同時是指針類型或者引用類型。換句話說,dynamic_cast 只能轉換指針類型和引用類型,其它類型(int、

double、數組、類、結構體等)都不行。

 

向上轉型與向下轉型

相關文章
相關標籤/搜索