概述
【实验名称】多态
【实验目的】
1、理解多态的基本概念;
2、掌握运算符重载的基本方法;
3、掌握运算符重载为成员函数和非成员函数的方法。
【实验原理】
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。
【实验内容】
1. 设计一个类Fraction,用于描述3/5这样由分子和分母两部分所构成的分数。为类设置必要的属性和成员函数,并重载运算符+,以实现对两个分数的相加。
代码(详细解释见注释):
#include<iostream>
using namespace std;
//用辗转相除法求最大公约数
int GCD(int a, int b)
{
int temp = b;
while (a%b != 0)
{
temp = a % b;
a = b;
b = temp;
}
return temp;
}
//分数类
class Fraction
{
public:
Fraction(int a = 1, int b = 1);
Fraction operator + (Fraction b);//加法,成员函数
friend Fraction operator - (Fraction a, Fraction b);//减法,非成员函数
void show();
private:
int mole;//分子
int deno;//分母
};
Fraction::Fraction(int a, int b)
{
mole = a;
deno = b;
}
//加法,成员函数
Fraction Fraction::operator + (Fraction b)
{
//通分
int m1 = mole * b.deno;
int m2 = deno * b.mole;
int d = deno * b.deno;
int m = m1 + m2;
//化简
int gcd = GCD(abs(m), abs(d));
m = m / gcd;
d = d / gcd;
return Fraction(m, d);
}
void Fraction::show()
{
cout << "结果为:" << mole << "/" << deno << endl;
}
//减法,非成员函数
Fraction operator - (Fraction a, Fraction b)
{
//通分
int m1 = a.mole * b.deno;
int m2 = a.deno * b.mole;
int d = a.deno * b.deno;
int m = m1 - m2;
//化简
int gcd = GCD(abs(m), abs(d));
m = m / gcd;
d = d / gcd;
return Fraction(m, d);
}
int main()
{
cout << "**********************" << endl;
cout << "*** 分数模拟器 ***" << endl;
cout << "*** 1.分数加法 ***" << endl;
cout << "*** 2.分数减法 ***" << endl;
cout << "*** 3.退出 ***" << endl;
cout << "**********************" << endl;
int flag;
while (true)
{
cout << "n请选择功能:";
cin >> flag;
if (flag == 1)
{
int m, d;
cout << "请输入第一个分数的分子和分母:";
cin >> m >> d;
if (d == 0)
{
cout << "分母为0,输入非法!" << endl;
continue;
}
Fraction f1(m, d);
cout << "请输入第二个分数的分子和分母:";
cin >> m >> d;
if (d == 0)
{
cout << "分母为0,输入非法!" << endl;
continue;
}
Fraction f2(m, d);
//加法
Fraction f3;
f3 = f1 + f2;
f3.show();
}
else if (flag == 2)
{
int m, d;
cout << "请输入第一个分数的分子和分母:";
cin >> m >> d;
if (d == 0)
{
cout << "分母为0,输入非法!" << endl;
continue;
}
Fraction f1(m, d);
cout << "请输入第二个分数的分子和分母:";
cin >> m >> d;
if (d == 0)
{
cout << "分母为0,输入非法!" << endl;
continue;
}
Fraction f2(m, d);
//减法
Fraction f3;
f3 = f1 - f2;
f3.show();
}
else if (flag == 3)
{
//退出
cout << "成功退出模拟器!" << endl;
break;
}
}
return 0;
}
运行演示:
【小结或讨论】
本次实验是我们第九次,也是最后一次C++课程实验,实验的主要内容是熟悉和理解类的多态,以及掌握运算符重载的不同方法。
这次内容不多,就实验来说,我分别尝试把运算符重载为成员函数和非成员函数,借此实现了分数的加法和减法。分数的运算主要有通分和化简两点。通分倒是比较简单,化简就稍微复杂一点。我使用辗转相除法求出了分子和分母的最大公因子,再把分子和分母分别除以最大公因子就完成了分数的化简。
在运算符重载这一块还需要注意的一处就是后置运算符“++”和“--”,如果要把它们重载,用来实现表达式oprd++或oprd--,那么运算符重载时,函数需要带有一个整型(int)形参。这里的int类型参数在运算中不起任何作用,只是用来区别后置++、--与前置++、--。
对于语言类课程来说,纸上得来终觉浅,绝知此事要躬行!在未来的求学道路上,还得沉下心来,继续俯首努力。
最后
以上就是深情小海豚为你收集整理的C++实验9 分数类【实验名称】多态【实验目的】【实验原理】【实验内容】【小结或讨论】的全部内容,希望文章能够帮你解决C++实验9 分数类【实验名称】多态【实验目的】【实验原理】【实验内容】【小结或讨论】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复