实验七运算符重载参考答案.docx

上传人:b****2 文档编号:24378946 上传时间:2023-05-26 格式:DOCX 页数:12 大小:16.40KB
下载 相关 举报
实验七运算符重载参考答案.docx_第1页
第1页 / 共12页
实验七运算符重载参考答案.docx_第2页
第2页 / 共12页
实验七运算符重载参考答案.docx_第3页
第3页 / 共12页
实验七运算符重载参考答案.docx_第4页
第4页 / 共12页
实验七运算符重载参考答案.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

实验七运算符重载参考答案.docx

《实验七运算符重载参考答案.docx》由会员分享,可在线阅读,更多相关《实验七运算符重载参考答案.docx(12页珍藏版)》请在冰豆网上搜索。

实验七运算符重载参考答案.docx

实验七运算符重载参考答案

实验七多态性—函数与运算符重载

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模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1