作业-day-240607

思维导图

C++编程

要求:

搭建一个货币的场景,创建一个名为 RMB 的类,该类具有整型私有成员变量 yuan(元)、jiao(角)和 fen(分),并且具有以下功能:

(1)重载算术运算符 + 和 -,使得可以对两个 RMB 对象进行加法和减法运算,并返回一个新的 RMB 对象作为结果。

(2)重载关系运算符 >,判断一个 RMB 对象是否大于另一个 RMB 对象,并返回 true 或 false。

(3)重载前置减减运算符 --,使得每次调用时 RMB 对象的 yuan、jiao 和 fen 分别减 1

(4)重载后置减减运算符 --,使得每次调用时 RMB 对象的 yuan、jiao 和 fen 分别减 1

(5)另外, RMB 类还包含一个静态整型成员变量 count,用于记录当前已创建的 RMB 对象的数量。每当创建一个新的 RMB 对象时,count 应该自增 1;每当销毁一个 RMB 对象时,count 应该自减 1。

要求,需要在main 函数中测试上述RMB 类的功能。

代码:

cpp 复制代码
#include <iostream>

using namespace std;

//定义类RMB
class RMB{
    //定义友元函数
    friend const RMB operator--(RMB &R, int);

private:
    int yuan;   //元
    int jiao;   //角
    int fen;    //分
    static int count;   //已创建的 RMB 对象的数量

public:
    //静态成员函数:获取当前count
    static int getCount()
    {
        return count;
    }

    //静态成员函数:修改当前count
    static void changeCount(int date)
    {
        count = date;
    }

    //无参构造函数
    RMB()
    {
        changeCount(++count);   //cout+1
    }

    //有参构造函数:初始化
    RMB(int y, int j, int f):yuan(y),jiao(j),fen(f)
    {
        changeCount(++count);   //cout+1
    }
    //成员函数:输出类信息
    void display()
    {
        cout << yuan << "元\t" << jiao << "角\t" << fen << "分" << endl;
    }

    //成员函数:=号运算符重载
    RMB &operator=(const RMB &other)
    {
        //避免给自己赋值
        if(this != &other)
        {
            yuan = other.yuan;
            jiao = other.jiao;
            fen = other.fen;
        }

        return *this;
    }

    //成员函数:+号运算符重载
    const RMB operator+(const RMB &R) const
    {
        RMB temp;
        temp.yuan = yuan + R.yuan;
        temp.jiao = jiao + R.jiao;
        temp.fen = fen + R.fen;

        if(temp.fen >= 10)  //进位:分>10,角+1,分-10
        {
            temp.jiao++;
            temp.fen -= 10;
        }

        if(temp.jiao >= 10) //进位:角>10,元+1,角-10
        {
            temp.yuan++;
            temp.jiao -= 10;
        }

        return temp;
    }

    //成员函数:-号运算符重载
    const RMB operator-(const RMB &R) const
    {
        RMB temp;
        temp.yuan = yuan - R.yuan;
        temp.jiao = jiao - R.jiao;
        temp.fen = fen - R.fen;
        if(temp.fen < 0)    //补位
        {
            temp.jiao--;
            temp.fen += 10;
        }
        if(temp.jiao < 0)   //补位
        {
            temp.yuan--;
            temp.fen += 10;
        }
        if(temp.yuan < 0)   //元为负数,则提醒
        {
            cout << "元已为负数!" << endl;
        }

        return temp;
    }

    //成员函数:>号运算符重载
    bool operator>(const RMB &R) const
    {
        if(yuan > R.yuan || (yuan == R.yuan && jiao > R.jiao) || (yuan == R.yuan && jiao == R.jiao && fen > R.fen) )
            return true;
        else
            return false;
    }
    //成员函数:--前置减减运算符重载
    RMB &operator--()
    {
        --fen;
        if(fen < 0)     //补位
        {
            jiao--;
            fen += 10;
        }
        --jiao;
        if(jiao < 0)    //补位
        {
            yuan--;
            jiao += 10;
        }
        --yuan;
        if(yuan < 0)    //元为负数,则提醒
        {
            cout << "元已为负数!" << endl;
        }

        return *this;
    }

};

//初始化静态变量count
int RMB::count = 0;

//全局函数:--后置减减运算符重载
const RMB operator--(RMB &R, int)
{
    RMB temp;
    temp.yuan = R.yuan--;
    temp.jiao = R.jiao--;
    temp.fen = R.fen--;
    if(temp.fen < 0)     //补位
    {
        temp.jiao--;
        temp.fen += 10;
    }

    if(temp.jiao < 0)    //补位
    {
        temp.yuan--;
        temp.jiao += 10;
    }

    if(temp.yuan < 0)    //元为负数,则提醒
    {
        cout << "元已为负数!" << endl;
    }

    return temp;
}

int main()
{
    RMB r1(100,9,5);
    cout << "cout = " << RMB::getCount() << endl;
    cout << "r1 =\t";
    r1.display();
    cout << "--r1 =\t";
    (--r1).display();

    RMB r2 = r1--;
    cout << "cout = " << RMB::getCount() << endl;
    cout << "r2 =\t";
    r2.display();
    cout << "r1-- =\t";
    r1.display();

    RMB r3(87,4,8);
    cout << "cout = " << RMB::getCount() << endl;
    cout << "r3 =\t";
    r3.display();

    RMB t1 = r1 - r3;
    cout << "cout = " << RMB::getCount() << endl;
    cout << "r1 =\t";
    r1.display();
    cout << "r3 =\t";
    r3.display();
    cout << "r1 - r3 =\t";
    t1.display();

    RMB t2 = r1 + r2;
    cout << "cout = " << RMB::getCount() << endl;
    cout << "r1 =\t";
    r1.display();
    cout << "r2 =\t";
    r2.display();
    cout << "r1 + r2 =\t";
    t2.display();

    if(r1 > r2)
        cout << "r1 > r2" << endl;
    else
        cout << "r1 < r2" << endl;

    return 0;
}

运行结果:

相关推荐
只做开心事1 小时前
C++之红黑树模拟实现
开发语言·c++
程序员老冯头2 小时前
第十五章 C++ 数组
开发语言·c++·算法
程序猿会指北3 小时前
【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler
c++·性能优化·harmonyos·openharmony·arkui·启动优化·鸿蒙开发
AC使者6 小时前
5820 丰富的周日生活
数据结构·算法
cwj&xyp7 小时前
Python(二)str、list、tuple、dict、set
前端·python·算法
无 证明7 小时前
new 分配空间;引用
数据结构·c++
xiaoshiguang311 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡11 小时前
【C语言】判断回文
c语言·学习·算法
别NULL11 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇11 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯