资源描述
实验5 运算符重载与多态性
班级 学号 姓名 郑成绩
一、实验目的
1.掌握用成员函数重载运算符的方法
2.掌握用友元函数重载运算符的方法
3.理解并掌握利用虚函数实现动态多态性和编写通用程序的方法
4.掌握纯虚函数和抽象类的使用
二、实验内容
1.复数类加减法乘除运算 (用成员函数定义运算符重载)。
复数类的定义:
class complex //复数类声明
{ public: //外部接口
complex(double r=0.0,double i=0.0) //构造函数
{real=r,imag=i;}
complex operator +(complex c2); //运算符"+"重载成员函数
complex operator - (complex c2); //运算符"-"重载成员函数
complex operator *(complex ); //运算符"*"重载成员函数
complex operator /(complex); //运算符"/"重载成员函数
complex operator =(complex c2); //运算符"="重载成员函数
void display(); //输出复数
private: //私有数据成员
double real; //复数实部
double imag; //复数虚部
};
实际程序:
#include<iostream>
using namespace std;
class complex //复数类声明
{ public: //外部接口
complex(double r=0.0,double i=0.0) //构造函数
{real=r,imag=i;}
complex operator +(complex c2); //运算符"+"重载成员函数
complex operator - (complex c2); //运算符"-"重载成员函数
complex operator *(complex c2 ); //运算符"*"重载成员函数
complex operator /(complex c2); //运算符"/"重载成员函数
complex operator=(complex c2); //运算符"="重载成员函数
void display(); //输出复数
private: //私有数据成员
double real; //复数实部
double imag; //复数虚部
};
complex complex::operator+(complex c2)
{
double R=real+c2.real;
double I=imag+c2.imag;
return complex(R,I);
}
complex complex:: operator - (complex c2)
{
double R=real-c2.real;
double I=imag-c2.imag;
return complex(R,I);
}
complex complex::operator *(complex c2)
{
double R=real*c2.real-imag*c2.imag;
double I=real*c2.imag+imag*c2.real;
return complex(R,I);
}
complex complex::operator /(complex c2)
{
double R=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
double I=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
return complex(R,I);
}
complex complex::operator=(complex c2)
{
double R=c2.real;
double I=c2.imag;
return complex(R,I);
}
void complex::display()
{
cout<<real<<"+"<<imag<<"i"<<endl;
}
void main()
{
complex c1(1,2);
cout<<"c1=";
c1.display();
complex c2(7,8);
cout<<"c2=";
c2.display();
complex c3(2.5,5);
cout<<"c3=";
c3.display();
complex c4(5.5,3);
cout<<"c4=";
c4.display();
complex c5=c1+c2;
cout<<"c1+c2=";
c5.display();
complex c6=c1-c3;
cout<<"c1-c3=";
c6.display();
complex c7=c1*c4;
cout<<"c1*c4=";
c7.display();
complex c8=c1/c2;
cout<<"c1/c2=";
c8.display();
complex c9=c4;
cout<<"c9=c4=";
c9.display();
}
2.复数类比较运算 (用友元函数定义运算重载)。
注意:
1)复数类比较运算按复数的模比较两个复数的大小。
2)复数相等判断当两个复数的实部和虚部都相等,两个复数才相等,否则不相等。
类的定义
class complex //复数类声明
{
public:
complex(double r=0.0,double i=0.0)
{real=r;imag=i;} //构造函数
friend int operator> (complex c1,complex c2); //运算符">"重载友元函数
friend int operator>=(complex c1,complex c2); //运算符">="重载友元函数
friend int operator <(complex c1,complex c2); //运算符"<"重载友元函数
friend int operator<=(complex c1,complex c2); //运算符"<="重载友元函数
friend int operator ==(complex c1,complex c2); //运算符"=="重载友元函数
friend int operator !=(complex c1,complex c2); //运算符"!="重载友元函数
void display( ); //显示复数的值
private: //私有数据成员
double real;
double imag;
};
实际程序:
#include<iostream.h>
#include<math.h>
class complex //复数类声明
{
public:
complex(double r=0.0,double i=0.0)
{real=r;imag=i;} //构造函数
friend int operator> (complex c1,complex c2); //运算符">"重载友元函数
friend int operator>=(complex c1,complex c2); //运算符">="重载友元函数
friend int operator <(complex c1,complex c2); //运算符"<"重载友元函数
friend int operator<=(complex c1,complex c2); //运算符"<="重载友元函数
friend int operator ==(complex c1,complex c2); //运算符"=="重载友元函数
friend int operator !=(complex c1,complex c2); //运算符"!="重载友元函数
void display( ); //显示复数的值
private: //私有数据成员
double real;
double imag;
};
int operator> (complex c1,complex c2)
{
double A=sqrt(c1.real*c1.real+c1.imag*c1.imag);
double B=sqrt(c2.real*c2.real+c2.imag*c2.imag);
if (A>B)
return 1;
else
return 0;
}
int operator>=(complex c1,complex c2)
{
double A=sqrt(c1.real*c1.real+c1.imag*c1.imag);
double B=sqrt(c2.real*c2.real+c2.imag*c2.imag);
if (A>=B)
return 2;
else
return 0;
}
int operator<(complex c1,complex c2)
{
double A=sqrt(c1.real*c1.real+c1.imag*c1.imag);
double B=sqrt(c2.real*c2.real+c2.imag*c2.imag);
if (A<B)
return -1;
else
return 0;
}
int operator<=(complex c1,complex c2)
{
double A=sqrt(c1.real*c1.real+c1.imag*c1.imag);
double B=sqrt(c2.real*c2.real+c2.imag*c2.imag);
if (A<=B)
return -1;
else
return 0;
}
int operator==(complex c1,complex c2)
{
if (c1.real==c2.real&&c1.imag==c2.imag)
return 1;
else
return 0;
}
int operator!=(complex c1,complex c2)
{
double A=sqrt(c1.real*c1.real+c1.imag*c1.imag);
double B=sqrt(c2.real*c2.real+c2.imag*c2.imag);
if (c1.real!=c2.real||c1.imag!=c2.imag||A!=B)
return 1;
else
return 0;
}
void complex::display()
{
cout<<real<<"+"<<imag<<"i"<<endl;
}
void main()
{
int a,b,c,d,e,f;
complex d1(1,3),d2(1,3),d3(2,4),d4(2,9),d5(5,7),d6(1,2),d7(5,4);
cout<<"d1=";d1.display();
cout<<"d2=";d2.display();
cout<<"d3=";d3.display();
cout<<"d4=";d4.display();
cout<<"d5=";d5.display();
cout<<"d6=";d6.display();
cout<<"d7=";d7.display();
a=d1>d2;
b=d1>=d4;
c=d1==d2;
d=d1<d5;
e=d1<=d6;
f=d1!=d7;
cout<<"d1>d3?"<<'\t'<<a<<endl;
cout<<"d1>=d4?"<<'\t'<<b<<endl;
cout<<"d1==d2?"<<'\t'<<c<<endl;
cout<<"d1<d5?"<<'\t'<<d<<endl;
cout<<"d1<=d6?"<<'\t'<<e<<endl;
cout<<"d1!=d7?"<<'\t'<<f<<endl;
}
3.利用虚函数实现的多态性来求四种几何图形的面积之和。这四种几何图形是:三角形、矩形、正方形和圆。几何图形的类型可以通过构造函数或通过成员函数来设置。
分析:
计算这四种几何图的面积公式分别是:
三角形的边长为W,高为H时,则三角形的面积为W* H/2;矩形的边长为W,宽为H时,则其面积为W* H;正方形的边长为S,则正方形的面积为S*S;圆的半径为R,其面积为 3.1415926 *R *R。
为设置几何图形的数据并求出几何图形的面积,需要定义一个包含两个虚函数的类:
class Shape
{public:
virtual float Area( void) =0; //纯虚函数,求面积
virtual void show(void) =0; //纯虚函数,显示数据
};
因面积的计算依赖于几何图形,故在类中只能定义一个纯虚函数Area。同理,设置输出数据的函数show也只能定义为纯虚函数。
把这个基类派生出其它几何图形类。如派生出的三角形类为:
class Triangle:public Shape
{ float W,H; //三角形边长为W,高为H
public:
Triangle(float w=0,float h=0){ W=w; H = h; }
float Area( void){ return W*H/2; }
void show()
{ cout<<"\n三角形:"<<" 边长:"<<W<<" 高:"<<H<<" 三角形面积:"<<Area()<<endl; }
};
输出界面:
#include<iostream>
#include<cmath>
using namespace std;
#define PI 3.1415926
class Shape
{public:
virtual float Area( void) =0; //纯虚函数,求面积
virtual void show(void) =0; //纯虚函数,显示数据
};
class Triangle:public Shape
{ float W,H; //三角形边长为W,高为H
public:
Triangle(float w=0,float h=0){ W=w; H = h; }
float Area( void){ return W*H/2; }
void show()
{ cout<<"\n三角形:"<<" 边长:"<<W<<" 高:"<<H<<" 三角形面积:"<<Area()<<endl; }
};
class Circle:public Shape
{
float R;
public:
Circle(float r=0){R=r;}
float Area(){return R*R*PI;}
void show()
{cout<<"\n圆形:"<<" 半径:"<<R<<" 圆的面积:"<<Area()<<endl;}
};
class Juxing:public Shape
{
float W,H;
public:
Juxing(float w=0,float h=0){ W=w; H = h; }
float Area(){return W*H;}
void show()
{cout<<"\n矩形:"<<" 长:"<<W<<" 宽:"<<H<<" 矩形的面积:"<<Area()<<endl;}
};
class Fangxing:public Shape
{
float S;
public:
Fangxing(float s=0){S=s;}
float Area(){return S*S;}
void show()
{cout<<"\n正方形:"<<" 边长:"<<S<<" 矩形的面积:"<<Area()<<endl;}
};
void main()
{
Triangle t1(4,5.3);
t1.show();
Circle c1(3.99);
c1.show();
Juxing j1(3.4,9.9);
j1.show();
Fangxing f1(5);
f1.show();
}
三、实验小结
在此次的实验中我掌握了成员函数和友元函数重载运算符的方法,并且理解了怎样利用虚函数实现动态多台性和编写通用程序的方法,还利用了纯虚函数和抽象类来解决了不同类型二维面的面积问题!这次实验把课上的理论在实践是实现,不在拘泥于书本上,更注重于动手!知识掌握的更牢固!此次实验是很成功的!
展开阅读全文