1.類型轉換按方式分為隱式轉換和顯式轉換。
隱式轉換:由編譯器自動完成,無需用戶干預。
顯式轉換:采用一定的形式進行轉換:類型名(數據) / C中(類型名)數據
2.關于轉換構造函數
構造函數的一種,主要用于類型轉換,格式嚴格規定為單參數構造函數。
例:Complex類
Complex(double r){Real=r;imag=0;} int(double r);
Complex a;
a=2.4; 相當于a=Complex(2.4);
編譯器如果發現語法有問題,會檢查是否存在轉換構造函數,有,則隱式轉換。
3.關于類型轉換函數
轉換構造函數是將一種數據類型轉換成類對象。如果編譯器發現需要將類轉換成某種數據類型,那該怎么辦?
類型轉換函數的一般形式:operator 類型名(){轉換函數的實現}
沒有函數類型,沒有參數。
例:
#include<iostream>
using namespace std;
class Complex
{
public :
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
operator double(){return real;}
private:
double real;
double imag;
};
int main()
{
Complex c1(3,4),c2(5,-10),c3;
double d;
d=2.5+c1;
cout<<d<<end1;
return0;
}
d=2.5+c1;
由于類成員沒有對運算符+重載,所以2.5與c1無法直接向加。編譯器發現存在類型轉換函數,故將 隱式調用double(), c1轉換為 double 型3,并將該結果存放在臨時變量里。運算d=2.5+3得到結果。
若主函數中有c3=2.5+c1;如果沒有運算符+的重載,編譯器會出錯。當 運算符重載函數作為類成員出現時,編譯器會理解為c3=2.5.operator +(c1);由于2.5非complex類,這種解析編譯器也會出錯。對于c3=c1+2.5的格式,編譯器會正確處理。
這種情況使用戶不能方便的使用交換率,為了改變這一不便,需要將重載函數作為友元函數而不是類成員函數。(雙目運算符的重載一般都采用友元函數的方式)
friend Complex operator +(Complex c1,complex c2);
在函數體外定義:
Complex operator +(Complex c1,complex c2);
{return Complex (c1.real +c2.real,c1.imag+c2.imag);}
這樣,對于c3=2.5+c1;(需要增加轉換構造函數)編譯器在遇到+號時,會搜索+兩端的數據并引用友元的運算符重載函數,其形式變為:c3=operator+(2.5,c1); 而參數定義都是Complex對象,因此,隱式調用轉換構造函數,形式變為:c3=operator+(Complex (2.5),c1);