作业-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;
}

运行结果:

相关推荐
Xの哲學6 分钟前
Linux设备管理:从内核驱动到用户空间的完整架构解析
linux·服务器·算法·架构·边缘计算
xinyu_Jina22 分钟前
Info Flow:去中心化数据流、跨协议标准化与信息源权重算法
算法·去中心化·区块链
Jac_kie_層樓25 分钟前
力扣hot100刷题记录(12.2)
算法·leetcode·职场和发展
雍凉明月夜39 分钟前
c++ 精学笔记记录Ⅰ
开发语言·c++·笔记
小鹏编程1 小时前
C++ 周期问题 - 计算n天后星期几
开发语言·c++
繁华似锦respect1 小时前
C++ unordered_map 底层实现与详细使用指南
linux·开发语言·c++·网络协议·设计模式·哈希算法·散列表
稚辉君.MCA_P8_Java1 小时前
Gemini永久会员 C++返回最长有效子串长度
开发语言·数据结构·c++·后端·算法
京东零售技术2 小时前
下一代 Lakehouse 智能未来新引擎 | Apache Hudi Meetup亚洲站活动回顾
算法
京东零售技术2 小时前
NeurIPS 2025 | TANDEM:基于双层优化的数据配比学习方法
后端·算法
ULTRA??2 小时前
Qt 数据类型体系(AI总结)
c++·qt