關於類型轉換函數和轉換構造函數的討論

關於構造函數的討論:

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))(調用了轉換構造函數),還是解釋成類型轉換函數的形式呢?

發佈了208 篇原創文章 · 獲贊 31 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章