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


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

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

  • 相关阅读:
    总结:工作 + 学习 (2019年)
    JVM 理解性学习(一)
    渗透神器cobalt strike在数字杀软环境下的使用
    普通路由器刷开源固件DD-WRT的简单过程
    云烟渗透题总结
    对thinkphp5.0框架的实例学习
    内网渗透 关于GPO
    简单尝试利用维控LeviStudioU的一栈缓冲区溢出漏洞
    试写foxit reader的ConvertToPDF功能的wrapper
    第05章下 加载内核
  • 原文地址:https://www.cnblogs.com/kaml8/p/9517666.html
Copyright © 2020-2023  润新知