思维导图
搭建一个货币的场景,创建一个名为 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;class RMB
{friend bool operator> (const RMB &l,const RMB &r);friend istream &operator>>(istream &cin, RMB &r);friend void compare(const RMB &l,const RMB &r);friend RMB operator ++(RMB &u);friend const RMB operator --(RMB &u,int);private:int yuan;int jiao;int fen;string name;static int count;public://无参构造函数RMB(){count++;}//有参构造函数,初始化用户名以及操作金额RMB(int yuan,int jiao,int fen,string name):yuan(yuan),jiao(jiao),fen(fen),name(name){cout<<"用户"<<name<<"加入"<<endl<<"操作金额:"<<yuan<<"元"<<jiao<<"角"<<fen<<"分"<<endl<<"==============================="<<endl;count++;}//析构函数~RMB(){count--;}//展示余额void show(){cout<<"用户:"<<name<<endl<<"余额:"<<yuan<<"元"<<jiao<<"角"<<fen<<"分"<<endl<<"==============================="<<endl;}//成员函数执行加操作const RMB operator+ (const RMB &r)const{RMB temp;temp.name=name;cout<<temp.name<<"执行'+'操作"<<endl<<"==============================="<<endl;temp.yuan=yuan+r.yuan;temp.jiao=jiao+r.jiao;temp.fen=fen+r.fen;//判断进位if(temp.fen>=10){temp.fen-=10;temp.jiao+=1;}if(temp.jiao>=10){temp.jiao-=10;temp.yuan+=1;}return temp;}//成员函数执行减操作const RMB operator- (const RMB &r)const{RMB temp;temp.name=name;cout<<temp.name<<"执行'-'操作"<<endl<<"==============================="<<endl;temp.yuan=yuan-r.yuan;temp.jiao=jiao-r.jiao;temp.fen=fen-r.fen;//判断借位if(temp.fen<0){temp.fen+=10;temp.jiao-=1;}if(temp.jiao<0){temp.jiao+=10;temp.yuan-=1;}if(temp.yuan<0){cout<<"余额不足!"<<endl;}return temp;}
};
//初始化静态变量count
int RMB::count=0;
//全局函数实现提取符重载
istream &operator>>(istream &cin, RMB &u)
{cin >>u.yuan>>u.jiao>>u.fen>>u.name;cout<<"用户"<<u.name<<endl<<"操作金额:"<<u.yuan<<"元"<<u.jiao<<"角"<<u.fen<<"分"<<endl<<"==============================="<<endl;return cin;
}
//全局函数执行判断‘>’操作
bool operator> (const RMB &l,const RMB &r){cout<<l.name<<"与"<<r.name<<"执行'>'操作"<<endl<<"==============================="<<endl;if(l.yuan>r.yuan){return true;}else if(l.yuan==r.yuan){if(l.jiao>r.jiao){return true;}else if(l.jiao==r.jiao){if(l.fen>r.fen){return true;}else{return false;}}else if(l.jiao<r.jiao){return false;}}else if(l.yuan<r.yuan){return false;}return 1;//防止出现无返回值的情况}
//定义一个函数专门用来提示比较结果
void compare(const RMB &l,const RMB &r){if(l>r){cout<<l.name<<">"<<r.name<<endl<<"==============================="<<endl;}else{cout<<l.name<<"<"<<r.name<<endl<<"==============================="<<endl;}}
//全局函数实现前++运算符重载
RMB operator ++(RMB &u){cout<<u.name<<"执行'前++'操作"<<endl<<"==============================="<<endl;u.yuan+=1;u.jiao+=1;u.fen+=1;if(u.fen>=10){u.fen-=10;u.jiao+=1;}if(u.jiao>=10){u.jiao-=10;u.yuan+=1;}return u;}
//全局函数实现后--运算符重载
const RMB operator --(RMB &u,int){cout<<u.name<<"执行'后--'操作"<<endl<<"==============================="<<endl;RMB temp;temp.yuan=u.yuan--;temp.jiao=u.jiao--;temp.fen=u.fen--;if(u.fen<0){u.fen+=10;u.jiao-=1;}if(u.jiao<0){u.jiao+=10;u.yuan-=1;}if(u.yuan<0){cout<<"余额不足!"<<endl;}return temp;}
int main(){RMB user1(10,8,9,"蔡徐坤");RMB add;cin>>add;RMB updateuser1;updateuser1=user1+add;updateuser1.show();RMB sub;cin>>sub;updateuser1=updateuser1-sub;updateuser1.show();RMB user2(8,6,9,"马嘉祺");compare(updateuser1,user2);++user2;user2.show();RMB user3=user2--;user3.show();user2.show();return 0;}