运算符重载函数作为类的友元函数

编写程序,完成以下功能:

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>。