思维导图
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 类的功能。
代码:
#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://静态成员函数:获取当前countstatic int getCount(){return count;}//静态成员函数:修改当前countstatic 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;elsereturn 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;elsecout << "r1 < r2" << endl;return 0;
}