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