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

运行结果:

相关推荐
浮生如梦_2 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
wheeldown5 小时前
【数据结构】选择排序
数据结构·算法·排序算法
青花瓷6 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
观音山保我别报错6 小时前
C语言扫雷小游戏
c语言·开发语言·算法
幺零九零零7 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
TangKenny7 小时前
计算网络信号
java·算法·华为