思维导图
搭建一个货币的场景,创建一个名为 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;
}