实验6运算符重载实验目的掌握运算符重载的规则;掌握运算符成员函数与运算符友元函数的实现及应用;学会定义类中单目和双目运算符的重载函数;理解重载运算符的作用,学会对典型的运算符进行重载。实验学时本次实验需要2个学时。实验要求实验上机之前,根据实验内容要求,自行设计编写程序,完成预习报告。实验上机时调试并修正程序。当次上机结束前分析错误原因并给出实验结论,提交实验报告。实验内容1.基础部分(1)定义复数类complex,包括私有数据成员实部real和虚部image。定义该类的构造,拷贝构造,析构函数。为该类重载运算符+,-(友元函数),前置和后置++,--(成员函数),插入符和提取符,(友元函数)。在main函数里定义复数对象,测试重载的这些运算符。2.进阶部分(2)设计一个mystring类,包括数据成员char*pstr;和intlength;通过运算符重载实现字符串的输入、输出、连接+=、赋值=、关系运算(==、!=、、)、下标[]等运算。/*(1)定义复数类complex,包括私有数据成员实部real和虚部image。定义该类的构造,拷贝构造,析构函数。为该类重载运算符+,-(友元函数),前置和后置++,--(成员函数),插入符和提取符,(友元函数)。在main函数里定义复数对象,测试重载的这些运算符。#includeiostream#includestringusingnamespacestd;classComplex{public:Complex(intreal1=0,intimage1=0):real(real1),image(image1){}~Complex(){};friendComplexoperator+(constComplex&a1,constComplex&a2);friendComplexoperator-(constComplex&a1,constComplex&a2);Complexoperator++();Complexoperator++(int);Complexoperator--();Complexoperator--(int);friendostream&operator(ostream&os,constComplex&a3);friendistream&operator(istream&is,Complex&a3);private:intreal;intimage;};Complexoperator+(constComplex&a1,constComplex&a2){returnComplex(a1.real+a2.real,a1.image+a2.image);}Complexoperator-(constComplex&a1,constComplex&a2){returnComplex(a1.real-a2.real,a1.image-a2.image);}ComplexComplex::operator++(){++real;++image;return*this;}ComplexComplex::operator++(int){Complexa=*this;++(*this);returna;}ComplexComplex::operator--(){--real;--image;return*this;}ComplexComplex::operator--(int){Complexa=*this;--(*this);return*this;}ostream&operator(ostream&os,constComplex&a3){osa3.real+a3.imagei;returnos;}istream&operator(istream&is,Complex&a3){isa3.reala3.image;returnis;}intmain(){Complexa4(4,5),a5(6,7),A,B;couta4:a4endl;couta5:a5endl;cout请重新为a4,a5对象输入数据:;cina4;cina5;cout重新输入后a4:a4endl;cout重新输入后a5:a5endl;A=a4+a5;cout重载修改后加法A:;coutAendl;A=a4-a5;cout重载修改后减法A:;coutAendl;cout重载修改后a4前置++:++a4endl;cout重载修改后a5后置++:a5++endl;cout重载修改后再次修改的a4前置--:--a4endl;cout重载修改后再次修改的a5后置--:a5--endl;return0;}(2)设计一个mystring类,包括数据成员char*pstr;和intlength;通过运算符重载实现字符串的输入、输出、连接+=、赋值=、关系运算(==、!=、、)、下标[]等运算。#includeiostream#includestringusingnamespacestd;classmystring{public:mystring(char*p);~mystring(){free(pstr);}mystring&operator=(mystring&s);voidoperator+=(mystring&a){this-pstr=(char*)realloc(this-pstr,this-length+a.length+1);strcpy(this-pstr+(this-length),a.pstr);}char&operator[](intn);booloperator==(constmystring&s){if(strcmp(this-pstr,s.pstr)==0)return1;elsereturn0;}booloperator!=(constmystring&s){if(strcmp(this-pstr,s.pstr)!=0)return1;elsereturn0;}booloperator(constmystring&s){if(strcmp(this-pstr,s.pstr)0)return1;elsereturn0;}booloperator(constmystring&s){if(strcmp(this-pstr,s.pstr)0)return1;elsereturn0;}friendostream&operator(ostream&os,constmystring&s){returnoss.pstrstrlen(s.pstr);}friendistream&operator(istream&is,mystring&s){delete[]s.pstr;iss.length;s.pstr=newchar[s.length+1];iss.pstr;*(s.pstr+s.length)='\0';returnis;}private:char*pstr;intlength;};mystring::mystring(char*p){this-pstr=(char*)malloc(strlen(p)+1);strcpy(this-pstr,p);this-length=strlen(p);}mystring&mystring::operator=(mystring&s){delete[]pstr;this-pstr=newchar[strlen(s.pstr)+1];if(pstr)strcpy(this-pstr,s.pstr);return*this;}char&mystring::operator[](intn){staticcharch=0;if(nlength||n0){cout数组越界endl;returnch;}elsereturn*(pstr+n);}intmain(){mystringa(abde),b(defe);//mystringc(a);//coutc;coutabendl;a=b;coutaendl;a+=b;coutaendl;cina;coutaendl;if(ab){couta字符串更大:aendl;}if(ab)coutb字符串更大:bendl;if(a==b)couta,b相等aendl;if(a!=b)couta,b不相等endl;a[1]='q';coutaendl;}实验心得:本次实验我们所学习的是函数的重载,函数的重载是为了满足不同环境下调用函数不同的问题。比如求最大值,我们三个值求最大值,两个值求更大值。在这里运用函数的重载我只需要定义一个函数为max,采用不同个数的形参就可以完成,这样使读者更加的清晰你要在这个函数中所表达的意思。通过本次实验,我也着实感受到了一次编程的乐趣,从中也学到了很多知识,如今C++的编程中我们所使用的语言更加的精简,没有C中那么多的繁琐,这次的实验也相对来说比较基础,知识为我么以后C++学习做好一个引子的作用,我相信下次的实验一定会是更加精彩的,能够让我有更多的体会,在C++中寻找到更大的乐趣和编程的动力。