实验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(){real=0;imag=0;}Complex(double r,double i){real=r;imag=i;}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){Complex c;c.real=real+c2.real;c.imag=imag+c2.imag; return c;}Complex Complex::operator-(Complex &c2){Complex c;c.real=real-c2.real;c.imag=imag-c2.imag;return c;}Complex Complex::operator*(Complex &c2){Complex c;c.real=real*c2.real-imag*c2.imag;c.imag=imag*c2.real+real*c2.imag; return c;}Complex Complex::operator/(Complex &c2){Complex c;c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);return c;}void Complex::display(){cout<<"("<<real<<","<<imag<<"i)"<<endl;}int main(){Complex c1(4,6),c2(3,7),c3;cout<<"c1=";c1.display();cout<<"c2=";c2.display();int i,j=1;while(j){cout<<"\n";cout<<"\t\t"<<"1.复数之和\n";cout<<"\t\t"<<"2.复数之差\n";cout<<"\t\t"<<"3.复数之积\n";cout<<"\t\t"<<"4.复数之商\n";cout<<"\t\t"<<"0.退出\n";cout<<"请选择(0--4) ";cin>>i;switch(i){case 1: c3=c1+c2;cout<<"c1+c2=";c3.display();break;case 2: c3=c1-c2;cout<<"c1-c2=";c3.display();break;case 3: c3=c1*c2;cout<<"c1*c2=";c3.display();break;case 4: c3=c1/c2;cout<<"c1/c2=";c3.display();break;case 0: j=0;break;}}}测试结果: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 bool operator> (complex c1,complex c2);friend bool operator>=(complex c1,complex c2);friend bool operator< (complex c1,complex c2);friend bool operator<=(complex c1,complex c2);friend bool operator==(complex c1,complex c2);friend bool operator!=(complex c1,complex c2);void display( );private:double real;double imag;};bool operator>(complex c1,complex c2){if(sqrt(c1.real*c1.real+c1.imag*c1.imag)>sqrt(c2.real*c2.real+c2.imag*c2.imag))return true;elsereturn false;}bool operator>=(complex c1,complex c2){if(sqrt(c1.real*c1.real+c1.imag*c1.imag)>sqrt(c2.real*c2.real+c2.imag*c2.imag)||sqrt(c1.real*c1.r eal+c1.imag*c1.imag)==sqrt(c2.real*c2.real+c2.imag*c2.imag))return true;elsereturn false;}bool operator<(complex c1,complex c2){if(sqrt(c1.real*c1.real+c1.imag*c1.imag)<sqrt(c2.real*c2.real+c2.imag*c2.imag))return true;elsereturn false;}bool operator<=(complex c1,complex c2){if(sqrt(c1.real*c1.real+c1.imag*c1.imag)<sqrt(c2.real*c2.real+c2.imag*c2.imag)||sqrt(c1.real*c1.r eal+c1.imag*c1.imag)==sqrt(c2.real*c2.real+c2.imag*c2.imag))return true;elsereturn false;}bool operator==(complex c1,complex c2){if(c1.real==c2.real&&c1.imag==c2.imag)return true;elsereturn false;}bool operator!=(complex c1,complex c2){if(c1.real!=c2.real||c1.imag!=c2.imag) return true;elsereturn false;}void complex::display(){cout<<"("<<real<<","<<imag<<"i)";}void compare(complex &c1,complex &c2){if(operator>(c1,c2)==1){c1.display();cout<<">";c2.display(); cout<<endl;} if(operator>=(c1,c2)==1){c1.display();cout<<">=";c2.display(); cout<<endl;} if(operator<(c1,c2)==1){c1.display();cout<<"<";c2.display(); cout<<endl;} if(operator<=(c1,c2)==1){c1.display();cout<<"<=";c2.display(); cout<<endl;} if(operator==(c1,c2)==1){c1.display();cout<<"=";c2.display(); cout<<endl;} if(operator!=(c1,c2)==1){c1.display();cout<<"!=";c2.display(); cout<<endl;} cout<<endl; }int main() {complex c1(2,3),c2(3,4),c3(3,4);cout<<"c1=";c1.display();cout<<endl;cout<<"c2=";c2.display();cout<<endl;cout<<"c3=";c3.display();cout<<endl;compare(c1,c2);compare(c1,c3);compare(c2,c3);return 0;}测试结果:3.利用虚函数实现的多态性来求四种几何图形的面积之和。