正文 第十章 運算符重載與類型轉換函數(3 / 3)

10.5運算符重載小結

在設計運算符重載時,應注意以下一些問題:

1.重載為友元運算符函數,其參數必須至少有一個是用戶自定義的數據類埋(類類型)

2.Visual C++中大多數運算符都可以被重載,以下幾個運算符除外:

3.用戶重新定義一個運算符時,不能改變運算符的操作數的個數。換一句話說,對於單目運算符,重載時必須帶一個參數;對於雙目運算符,重載時必須帶兩個參數;三目運算符不能重載。

4.運算符函數隻能從C++中已有的運算符集中選擇恰當的運算符進行童載,不允許用戶重新定義一個非Visual C++中內建的運算符。

5.運算符函數本身是一個函數,因此可以為同一個運算符重載多個運算符函數。例如,重栽運算符“時,可以把它作為減法和負號兩種操作同時重載。

6.由於運算符函數都很少且在程序中使用頻繁,因此將其設置為內聯函數(inline)比較合適。

7.將一個運算符函數設計為成員運算符函數還是友員運算函數,要根據具體情況而定,但以下的運算符隻允許被重載為戒員運算符函數。

8.重載單目運算符,因為隻有一個參數,使用成員運算符函數最恰當,重載為友元運算符函數也可以。

重載雙運算符時,使用友元運算符函數比成員運算符函數具有更大的靈活性。

10.6數據類型的轉換

Visual C++的編譯器對於內建的數據類型有自己的一套轉換規則,當用戶把某種類型的數據或變量賦值給另一種數據類型的變量時,C++用這套規則自動轉換成最後所希望的類型。

雖然通過類型轉換敢得的值可能與我們預期的結果稍有差別,但至少這樣的語句在編譯時不會發生問題。此外,C++還提供了強製轉換功能。

其結果便是指針變量ptr的值為100(注意,不是*ptr=100)0但對於用戶定義的數據類型(如類等),Visual C++則不能通過這套規則完成自動數據類型轉換。因此,我們必須自己提供類型轉換功能,以實現類與類之間的相互轉換,或者類與C++內建數據類型之間的相互轉換。

一、內建數據類型轉換成類類型

這種轉換是通過類的構造函數完成的。當一個類中存在隻有一個參數的構造函數時,C++的編譯器將自動視其為轉換函數,該構造函數指定了從參數的類型向類類型的一種轉換。

同樣道理,當一個整數作為實參傳遞給一個以Complex對象為形參的函數時,在調用承歎之前,就要對該整數進行轉換。

因此,通過這種轉換,我們可以使用類Complex中的運算符函數處理幾種不同形式的表達式。

注意,在本例中,0peratOT+()隻能是友元運算符函數。如果說明為成員運算符函數編譯器就會把表達式6.operator+(c2)這顯然不對,因為一個整數無法作為一個活動對象來調用執行加法的成員運算符函數。

在友元運算符函數中,該整數作為實參傳遞給以Complex對象為形參的operator+()函數時,在調用函數之前,就已經將該整數轉換成了Complex對象。

二、類型轉換函數

當要將自己定義的類類型轉換成其他數據類型時,就霈要定義一個“類型轉換函數”。類型轉換函數是一種特殊的成員函數,其一般形式為:operator類型名();其中,operator是Visual C++的關鍵字,類型名可以是C++的內建類型名或用戶自定義的類名。類型名還可以是數據類型名與修飾符*,[],以及()和const等組成的表達式。類型轉換函數不能帶有任何參數,也不能指定返回類型,它的返回類型際上是類型名。下麵我們通過一個例子來說明類型轉換函數的概念。

賦值運算符的左邊是double類型,右邊是Complex類型,編譯器期望從Complex類型向double類型轉換。於是,編譯器在類中查找適合轉換的成員函數,即函數operatordouble0。該函數返回Complex類的對象(複數)的實部。

轉換函數比較適合於由類類型到類類型的轉換,因為,此種情況不能設計個具有單參數的構造函數,故必須使用類型轉換函數。

三、數播類型轉換的不確定性

例10.7中,在類Complex中定義一個類型轉換函數operatordouble()後,會產生一些問題。看一看下麵的語句:

對於這個語句,編譯器既可以將cl轉換為一個浮點數(轉換函數),再將它與整數相加;也可以將整數20轉換成一個Complex對象(執行構造函數轉換),再將兩個Complex對象相加。應該選擇哪一種轉換,編譯器對此無法選擇,隻好產生一個錯誤。

解決這種不確定性有若幹種方法。一種方法是去掉單參數的構造函數轉換,從而沒有整數到Complex對象的轉換,這樣可以把上麵的語句重寫成。

這樣,編譯器無須任何轉換,隻要調用與每一種表達式匹配的運算符函數即可。這種解決方法,在定義類時需要做更多的工作,但它使類的可用性更好。

由此可以看出,如果既要重栽運算符,又要定義轉換函數,就必須特別慎重。

10.7舉例

在本節中,我們講兩個特殊運算符的重載。

例10.8在類STRING中重栽[]。[]是數組下標運算符,它隻能被重栽為成員運算符。在重栽[]時,把它用作雙目運算符,因此需要一個參數。