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