思维导图
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:
//静态成员函数:获取当前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;
}