《运算符重载(1).doc》由会员分享,可在线阅读,更多相关《运算符重载(1).doc(7页珍藏版)》请在金锄头文库上搜索。
1、实验7 运算符重载(1)实验目的:1、理解什么是运算符重载;2、熟悉运算符函数的声明、定义、调用;3、掌握使用类的成员函数重载运算符方法;4、掌握使用友元函数重载运算符方法;5、熟悉算术运算符、关系运算符的重载方法;6、了解CTime等MFC类中的运算符重载情况。实验内容 1、复数是大家中学时期就学过的知识,设 a+bi 和 c+di 是两个复数,则它们的四则运规则如下: 请按下列步骤操作,体会什么是运算符重载,理解实现运算符使用的两种基本方法:(1) 复制下列代码到开发工具并加以运行,观察整数的+、-运算是否成功?#include using namespace std;class Comp
2、lexprivate:double real,image; /分别为实部、虚部public:Complex(double rel=0, double img=0)real=rel;image=img;void display()/输出(a+b*i) 、(a-b*i) 、(a)等形式cout (0) cout+image*i) ;/虚部为正else if (image0) coutimage*i) ;/虚部为负elsecout) ;/虚部为,即为实数/位置1;/位置2void main()int i1=100, i2=10, i3, i4;i3=i1+i2;i4=i1-i2;couti1+i2=
3、i3endl;couti1-i2=i4endl;/位置3(2) 复制下列代码到 位置3 处,再次编译、运行程序,观察复数的+、-运算是否可行?从中得出什么结论?试说明其中的原因。Complex c1(1,2), c2(3,-4),c3,c4; c3=c1+c2;c4=c1-c2;/输出加的结果c1.display();cout+;c2.display();cout=;c3.display(); coutendl; /输出减的结果c1.display();cout-;c2.display();cout=;c4.display (); coutendl;(3) 分别复制下列两段代码到 位置1和 位
4、置2 处,再次编译、运行程序,观察这次的复数+、-运算能否成功?再次得出什么结论?代码段1Complex operator +(Complex & c);/用成员函数重载friend Complex operator -(Complex & c1,Complex & c2);/用友元函数重载代码段2/成员函数的类外定义Complex Complex:operator +(Complex & c)Complex temp;temp.real=real+c.real;temp.image=image+c.image;return temp;/友元函数的定义Complex operator -(Co
5、mplex & c1,Complex & c2)Complex temp;temp.real=c1.real-c2.real;temp.image=c1.image-c2.image;return temp;(4)分析上述代码,结合小课ppt理解运算符函数的声明、定义、调用,熟悉运算符重载的两种基本方法:使用类成员函数和友元函数,注意它们之间参数的差异。 2、参照上一题的程序,掌握用类成员函数重载运算符的方法要求:在程序的适当位置填写程序代码,使用成员函数方法实现下列运算符重载:(1) 复数 + 实数(double) 运算;(2) 复数 * 复数 运算。程序代码:#include using
6、namespace std;class Complexprivate:double real,image; /分别为实部、虚部public:Complex(double rel=0, double img=0)real=rel;image=img;void display()/输出(a+b*i) 、(a-b*i) 、(a)等形式cout (0) cout+image*i) ;/虚部为正else if (image0) coutimage*i) ;/虚部为负elsecout) ;/虚部为,即为实数Complex operator +(Complex & c);/用成员函数重载;/成员函数的类外定
7、义Complex Complex:operator +(Complex & c)Complex temp;temp.real=real+c.real;temp.image=image+c.image;return temp;void main()Complex c1(1,2), c2(3,-4),c3,c4;c3=c1+123.456;c4=c1*c2; /输出加的结果c1.display();cout+;cout123.456;cout=;c3.display(); coutendl; /输出*的结果c1.display();cout*;c2.display();cout=;c4.displ
8、ay (); coutendl;3、参照上两题的程序,掌握用友元函数重载运算符的方法要求:在程序的适当位置填写程序代码,使用友元函数方法实现下列运算符重载:(1) 复数 / 实数(double) 运算;(2) 复数 = 复数 运算; (结果:int型,1表示“true”,0表示“false”)(3) 复数 != 复数 运算。(结果:int型,1表示“true”,0表示“false”)程序代码:#include using namespace std;class Complexprivate:double real,image; /分别为实部、虚部public:Complex(double re
9、l=0, double img=0)real=rel;image=img;void display()/输出(a+b*i) 、(a-b*i) 、(a)等形式cout (0) cout+image*i) ;/虚部为正else if (image0) coutimage*i) ;/虚部为负elsecout) ;/虚部为0,即为实数friend Complex operator -(Complex & c1,Complex & c2);/用友元函数重载;/友元函数的定义Complex operator -(Complex & c1,Complex & c2)Complex temp;temp.rea
10、l=c1.real-c2.real;temp.image=c1.image-c2.image;return temp;void main()Complex c1(10,9), c2(3,-4),c3;c3=c1/5; /输出除的结果c1.display();cout/;cout5;cout=;c3.display(); coutendl; /输出比较的结果coutc1=c2 ? 结果:;cout(c1=c2)endl;coutc1!=c2 ? 结果:;cout(c1!=c2)endl;问题:能否不调用display()成员函数,而是采用cout方式连续输出Complex呢?4、书上P256:10.4.2的第(1)题。5、在大名鼎鼎的MFC类中,除了包含数据成员、成员函数外,还有一项重要内容就是运算符重载,熟知这些内容对于完整理解MFC类的强大功能是很必要的,下图所示的就是CTime类的运算符重载情况:在vs2005VCatlmfcinclude 目录中包含有atltime.h和atltime.inl两个文件,其中就有运算符重载的声明、代码(lab_7目录中给出它们的简化版本)。请阅读这些文件内容,了解MFC类中的运算符重载是怎样实现的。