關於構造函數的討論:
http://blog.163.com/zhoumhan_0351/blog/static/3995422720100250413207/
關於類型轉換的討論
http://blog.163.com/zhoumhan_0351/blog/static/39954227201001934025333/
現在,再引入另一種構造函數轉換構造函數
1、轉換構造函數
轉換構造函數只有一個形參,如
Complex(double r) {real=r;imag=0;}
其作用是將double型的參數r轉換成Complex類的對象,將r作爲複數的實部,虛部爲0。
使用轉換構造函數將一個指定的數據轉換爲類對象的方法如下:
(1) 先聲明一個類。
(2) 在這個類中定義一個只有一個參數的構造函數,參數的類型是需要轉換的類型,在函數體中指定轉換的方法。
(3) 在該類的作用域內可以用以下形式進行類型轉換:
類名(指定類型的數據)
不僅可以將一個標準類型數據轉換成類對象,也可以將另一個類的對象轉換成轉換構造函數所在的類對象。如可以將一個學生類對象轉換爲教師類對象,可以在Teacher類中寫出下面的轉換構造函數:
Teacher(Student& s){num=s.num;strcpy(name,s.name);sex=s.sex;}
但應注意: 對象s中的num,name,sex必須是公用成員,否則不能被類外引用。用轉換構造函數可以將一個指定類型的數據轉換爲類的對象。但是不能反過來將一個類的對象轉換爲一個其他類型的數據(例如將一個Complex類對象轉換成double類型數據)。如果要這麼做,則需要用下面的類型轉換函數。
2、類型轉換函數
類型轉換函數的一般形式爲
operator 類型名( )
{實現轉換的語句}
operator double( )
{return real;}
也稱爲類型轉換運算符重載函數(或稱強制類型轉換運算符重載函數)。
在函數名前面不能指定函數類型,函數沒有參數。其返回值的類型是由函數名中指定的類型名來確定的(如上面例程中爲double)。類型轉換函數只能作爲成員函數,因爲轉換的主體是本類的對象。不能作爲友元函數或普通函數。它與運算符重載函數相似,都是用關鍵字operator開頭,只是被重載的是類型名。double類型經過重載後,除了原有的含義外,還獲得新的含義(將一個Complex類對象轉換爲double類型數據,並指定了轉換方法)。這樣,編譯系統不僅能識別原有的double型數據,而且還會把Complex類對象作爲double型數據處理。
轉換構造函數和類型轉換運算符有一個共同的功能: 當需要的時候,編譯系統會自動調用這些函數,建立一個無名的臨時對象(或臨時變量)。
在已定義了相應的轉換構造函數情況下,將運算符“+”函數重載爲友元函數,在進行兩個複數相加時,可以用交換律。
#include <iostream>
using namespace std;
class Complex
{public:
Complex( ){real=0;imag=0;} //默認構造函數
Complex(double r){real=r;imag=0;} //轉換構造函數
Complex(double r,double i){real=r;imag=i;}//實現初始化的構造函數
friend Complex operator + (Complex c1,Complex c2); //重載運算符
//“+”的友元函數
void display( );
private:
double real;
double imag;
};
Complex operator + (Complex c1,Complex c2)//定義運算符“+”重
//載函數
{return Complex(c1.real+c2.real, c1.imag+c2.imag);}
void Complex∷display( )
{cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;}
int main( )
{Complex c1(3,4),c2(5,-10),c3;
c3=c1+2.5; //複數與double數據相加
c3.display( );
return 0;
}
如果在上面的類中,再加之定義類型轉換函數:
operator double( ){return real;} //類型轉換函數
則會出問題,因爲這時候,編譯系統也搞不清楚了,到底是將 c3=c1+2.5; 解釋成operator+(c1,Complex(2.5))(調用了轉換構造函數),還是解釋成類型轉換函數的形式呢?