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

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 }

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

主函数赋值中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"的头文件可以支持此功能。

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试