運算子過載函式作為類的友元函式

2021-10-04 10:23:42 字數 1798 閱讀 4018

編寫程式,完成以下功能:

1)定義表示金額的類money,有私有成員yuan、jiao、fen,分別代表元、角、分的值;

2)將+、-、*、/四個運算子過載為普通函式,然後宣告為money類的友元;

3)編寫main函式,測試money。

**如下:

1 #include2

using

namespace

std;

3 #include

4class money //

建立money類

5 ;16

17void money::optimize() //

money調整函式

1820

else

if(fen<0)

21if(jiao>=10)

22else

if(jiao<0)23}

2425

26 money::money(int y,int j,int

f)27

2829 money operator+(money a,money b) //

+ 運算子過載的類外定義

3038

39 money operator-(money a,money b) //

- 運算子過載的類外定義

4048

49 money operator*(money a,money b) //

* 運算子過載的類外定義

5058

59 money operator/(money a,money b) //

/運算子過載的類外定義

6068

69void money::display(string

str)

70 71

72int

main()

73

執行結果:

一開始我的money調整函式是這樣的:

void

money::optimize()

if(jiao>=10)

}

執行結果:

結果的第二行」角「居然出現了負數-20!什麼原因導致的呢?讓我們回到**分析。

主函式賦值中cost1(300,5,6)和cost2(105,7,6),發現5」角「<7」角「;再看給出的調整函式比較的是    if(fen>=10)和if(jiao>=10),發現問題:調整函式未考慮0怎麼解決呢?低位不夠就往高位借唄。計算過程是沒問題的,而且我們要的是結果,所以可以根據結果來修正。在原調整函式新增:

else if(fen<0)   

//輸出結果」分「為負數時,向」角「借一位,」角「減1,分加10。

同理:else if(jiao<0)

//輸出結果」角「為負數時,向」元「借一位,」元「減1,角加10。

另外:dev c++及vc++2005以上編譯器執行結果正確,而vc++6.0下會報錯:

原因:vc++6.0編譯系統沒有完全實現c++標準,它所提供的不帶字尾".h"的標頭檔案不支援把雙目運算子過載為友元函式。但是它提供的帶字尾".h"的標頭檔案可以支援此功能。

解決方法:

法一:使用dev c++及vc++2005以上編譯器。

法二:將標頭檔案改為#include。

運算子過載函式作為類成員函式和友元函式

運算子過載函式既可以做為類成員函式也可以過載為友元函式,但使用定義方法和使用上是由較大差別的。首先看乙個運算子過載函式作為類成員函式的示例 定義complex為複數類,過載運算子 實現複數的相加。程式1.1 include using namespace std class complex comp...

10 2 運算子過載函式作為類成員函式和友元函式

complex operator complex c2 是雙目運算子,函式過載中只有乙個引數,實際上運算子過載函式有兩個引數,是由於過載函式是complex類中的成員函式,有乙個引數是隱含的,運算子函式是用this 指標隱士的訪問物件成員函式。complex operator complex thi...

C 運算子過載函式作為類成員函式和友元函式

例10.2中對運算子 進行了過載,使之能用於兩個複數的相加。在該例中運算子過載函式operator 作為complex類中的成員函式。可能有的讀者會提出這樣的問題 是雙目運算子,為什麼在例10.2程式中的過載函式中只有乙個引數呢?實際上,運算子過載函式有兩個引數,由於過載函式是complex類中的成...