实验七运算符重载参考答案.docx
- 文档编号:5498270
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:10
- 大小:16.46KB
实验七运算符重载参考答案.docx
《实验七运算符重载参考答案.docx》由会员分享,可在线阅读,更多相关《实验七运算符重载参考答案.docx(10页珍藏版)》请在冰豆网上搜索。
实验七运算符重载参考答案
实验七多态性—函数与运算符重载
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实验总结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 运算 重载 参考答案