实验七运算符重载参考答案Word文档下载推荐.docx
《实验七运算符重载参考答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验七运算符重载参考答案Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
{
real=0;
imag=0;
}
CComplex(intx,inty)
real=x;
imag=y;
intreal;
intimag;
CComplexoperator+(CComplexobj1)//---------------------------------------------①
CComplexobj2(real-obj1.real,imag-obj1.imag);
returnobj2;
};
intmain()
CComplexobj1(100,30);
CComplexobj2(20,30);
CComplexobj;
obj=obj1+obj2;
//------------------------------------------------------------------②
cout<
<
obj.real<
endl;
obj.imag<
endl;
return0;
}
问题一:
①处的运算符重载,为什么该函数的返回值要设计成CComplex类型?
答:
因为在函数中returnobj2,obj2是CComplex类型,所以函数返回值要与return返回的类型相同,即设计成CComplex类型。
问题二:
②处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);
”,但是为什么CComplex类中的运算符重载函数只设计了一个参数?
因为成员函数经编译后会产生this指针,this指针会指向调用该函数的obj1对象,该obj1对象就是就相当于函数的第一个参数。
因此可以在函数参数列表中只设计一个参数。
问题三:
上述程序设计合理吗?
为什么?
不合理,因为它所实现的功能是obj2-obj1,而重载运算符的名字为“+”,这使用起来非常不直观,会让人以为这实现的功能是obj1+obj2。
2.理解下面的程序,并运行查看结果,回答程序后面的问题。
real=0.0;
imag=0.0;
CComplex(floatx,floaty)
CComplexoperator+(CComplex&
obj1,CComplex&
obj2)
CComplexobj3(obj1.real+obj2.real,obj1.imag+obj2.imag);
returnobj3;
CComplex&
operator++(CComplex&
obj)//重载前置自增运算符
++obj.real;
++obj.imag;
returnobj;
voidprint()
cout<
real<
"
+"
imag<
i"
private:
floatreal;
floatimag;
CComplex&
operator--(CComplex&
x)//重载前置自减运算符
--x.real;
--x.imag;
returnx;
CComplexobj1(2.1,3.2);
CComplexobj2(3.6,2.5);
cout<
obj1="
;
obj1.print();
obj2="
obj2.print();
CComplexobj3=obj1+obj2;
before++,obj3="
obj3.print();
++obj3;
after++,obj3="
--obj3;
after--,obj3="
CComplexobj4=++obj3;
obj4="
obj4.print();
以上程序中的三个运算符重载都有错误,试改正过来,使程序输出正确结果。
1.两个复数相加
●修改方案一:
将CComplexoperator+(CComplex&
obj2);
定义为友元函数在类体外写。
●修改方案二:
的形参改为一个,写在类体中,哪个对象调用,即对其与另一个对象进行运算符操作。
2.前置自增
修改方案:
重置自增运算符,设置无形参的重载函数,对所使用的对象进行自增,在通过return*this返回该对象。
3.前置自减
忘记在类中声明为友元函数。
正确代码:
obj2)//1
CComplexobj3(real+obj2.real,imag+obj2.imag);
operator++()//重载前置自增运算符//2
++real;
++imag;
return*this;
friendCComplex&
x);
//3
7.2.2程序设计
1.把7.2.1中第二道题的程序改造成能实现复数的减法、乘法、除法以及后置“++”、“--”运算,并设计主函数来验证重载运算符的用法。
CComplexoperator-(CComplex&
CComplexobj3(real-obj2.real,imag-obj2.imag);
CComplexoperator++(int)//重载后置自增运算符
CComplextemp(*this);
real++;
imag++;
returntemp;
CComplexoperator--(int)//重载后置自减运算符
CComplextemp(*this);
real--;
imag--;
if(imag>
=0){
else{
}
friendCComplexoperator*(CComplex&
//两个复数相乘
friendCComplexoperator/(CComplex&
//两个复数相除
CComplexoperator*(CComplex&
obj2){
returnCComplex((obj1.real*obj2.real-obj1.imag*obj2.imag),(obj1.imag*obj2.real+obj1.real*obj2.imag));
CComplexoperator/(CComplex&
returnCComplex((obj1.real*obj2.real+obj1.imag*obj2.imag)/(obj2.real*obj2.real+obj2.imag*obj2.imag),(obj1.imag*obj2.real-obj1.real*obj2.imag)/(obj2.real*obj2.real+obj2.imag*obj2.imag));
CComplexobj1(3,-1);
CComplexobj2(2,-1);
obj1*obj2="
CComplexobj3=obj1*obj2;
obj1/obj2="
CComplexobj4=obj1/obj2;
before++,obj2="
obj2=obj2++;
after++,obj2="
before--,obj2="
obj2=obj2--;
after--,obj2="
7.4实验总结