運算符重載函數作為類的友元函數


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

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

2)將+、-、*、/四個運算符重載為普通函數,然后聲明為Money類的友元;

3)編寫main函數,測試Money。

代碼如下:

 1 #include<iostream>
 2 using namespace std;
 3 #include<string>
 4 class Money                                   //創建Money類
 5 {public:
 6     Money(int y=0,int j=0,int f=0);
 7     friend Money operator+(Money a,Money b);  //重載+運算符
 8     friend Money operator-(Money a,Money b);  //重載-運算符
 9     friend Money operator*(Money a,Money b);  //重載*運算符
10     friend Money operator/(Money a,Money b);  //重載/運算符
11     void Display(string);                     //聲明輸出函數
12 private:
13     int yuan,jiao,fen;                        //定義私有成員元、角、分
14     void Optimize();
15 };
16 
17 void Money::Optimize()                        //Money調整函數
18 {
19     if(fen>=10)    {    jiao++;    fen-=10;    }
20     else if(fen<0){    jiao--;    fen+=10;    }
21     if(jiao>=10)    {    yuan++;    jiao-=10;    }
22     else if(jiao<0){    yuan--;    jiao+=10;    }
23 }
24 
25 
26 Money::Money(int y,int j,int f)
27 {    yuan=y;    jiao=j;    fen=f;    Optimize();    }
28 
29 Money operator+(Money a,Money b)              // + 運算符重載的類外定義
30 {
31     Money t;
32     t.yuan=a.yuan+b.yuan;
33     t.fen=a.fen+b.fen;
34     t.jiao=a.jiao+b.jiao;
35     t.Optimize();
36     return t;
37 }
38 
39 Money operator-(Money a,Money b)              // - 運算符重載的類外定義
40 {
41     Money t;
42     t.yuan=a.yuan-b.yuan;
43     t.fen=a.fen-b.fen;
44     t.jiao=a.jiao-b.jiao;
45     t.Optimize();
46     return t;
47 }
48 
49 Money operator*(Money a,Money b)              // * 運算符重載的類外定義
50 {
51     Money t;
52     t.yuan=a.yuan*b.yuan;
53     t.fen=a.fen*b.fen;
54     t.jiao=a.jiao*b.jiao;
55     t.Optimize();
56     return t;
57 }
58 
59 Money operator/(Money a,Money b)              // /運算符重載的類外定義
60 {
61     Money t;
62     t.yuan = a.yuan/b.yuan;
63     t.fen=a.fen/b.fen;
64     t.jiao=a.jiao/b.jiao;
65     t.Optimize();
66     return t;
67 }
68 
69 void Money::Display(string str)
70 {    cout<<str<<"="<<yuan<<"."<<jiao<<fen<<""<<endl;    }
71 
72 int main()
73 {
74     Money cost1(300,5,6),cost2(105,7,6),total1,total2,total3,total4;
75     total1=cost1+cost2;
76     total2=cost1-cost2;
77     total3=cost1*cost2;
78     total4=cost1/cost2;
79     total1.Display("total1=cost1+cost2");
80     total2.Display("total2=cost1-cost2");
81     total3.Display("total3=cost1*cost2");
82     total4.Display("total4=cost1/cost2");
83 
84     getchar();getchar();
85     return 0;
86 }

運行結果:

一開始我的Money調整函數是這樣的:

void Money::Optimize()
{
    if(fen>=10)    {    jiao++;    fen-=10;    }
    if(jiao>=10)    {    yuan++;    jiao-=10;    }
}

運行結果:

結果的第二行”角“居然出現了負數-20!什么原因導致的呢?讓我們回到代碼分析。

    主函數賦值中cost1(300,5,6)和cost2(105,7,6),發現5”角“<7”角“;再看給出的調整函數比較的是    if(fen>=10)和if(jiao>=10),發現問題:調整函數未考慮0<fen<10和0<jiao<10的情況。

怎么解決呢?低位不夠就往高位借唄。計算過程是沒問題的,而且我們要的是結果,所以可以根據結果來修正。在原調整函數添加:

else if(fen<0){    jiao--;    fen+=10;    }   

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

同理:

else if(jiao<0){    yuan--;    jiao+=10;    }

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

 

另外:

dev c++及VC++2005以上編譯器運行結果正確,而VC++6.0下會報錯:

原因:

VC++6.0編譯系統沒有完全實現C++標准,它所提供的不帶后綴".h"的頭文件不支持把雙目運算符重載為友元函數。但是它提供的帶后綴".h"的頭文件可以支持此功能。

解決方法:

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

法二:將頭文件改為#include<iostream.h>。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM