电子科技大学实验报告学生姓名:戴嘉乐学号:2012221010021指导教师:陈安龙实验地点:信软305实验时间:2013.11.18一、实验室名称:软件实验室二、实验项目名称:面向对象程序设计—运算符重载三、实验学时:8四、实验原理:面向对象另外一个核心概念是多态性。所谓多态,是指一个名字(或符号)具有多种含义。这对仿真客观世界以及提升软件的灵活性有相当重要的意义。在面向对象的程序设计语言中,多态是通过重载(overload)来实现的。C语言中,有许多系统预定义的运算符例如“+”,它可以用于整数类型数据,也可用于实数类型数据,虽然使用相同的运算符,但生成的目标代码不相同。这时,“+”运算符具有两种不同的解释(实现代码)。也就是说,像“+”这样的运算符在C语言中已经被重载。不幸的是,C语言仅支持少量有限的运算符重载。C++语言扩充了这个功能,允许已存在的预定义运算符由用户在不同的上下文中做出不同的解释。即:如果是类类型的对象使用运算符,则使用的是运算符新的含义;而其他类型的数据使用运算符,使用的是运算符原来的含义。在原来预定义的运算符的含义的基础上,再定义对于某个用户定义类型的对象进行操作的新的含义,这就是运算符重载。这使得程序员可以用常规的运算符来表达自定义类型的运算,而不是使用函数调用。举个例子来说,考虑复数的加法,很明显,c1+c2这样的语法比ComplexAdd(c1,c2)这样的语法要清晰易解。五、实验目的:本实验通过编写一些简单的程序,使学生掌握(运算符)函数重载和友元的概念,并能熟练应用在C++类上,培养理论联系实际和自主学习的能力,提高程序设计水平。六、实验内容:为了使代码更加清晰易读,准备为类重载如下运算符:1)为各种形体类重载++运算符(包括前缀和后缀),用于将它们的所有特征值加1。注意前缀和后缀形式上的区别;2)为各种形体类重载运算符,用以代替draw()操作。这需要用到友元;3)为各种形体类重载=运算符,用以完成两个相同类型形体对象的赋值;4)为List类重载=运算符,用以完成两个List对象间的赋值;5)为List类重载+=运算符,用以替代push_back()操作。不需要删除已定义好的push_back()成员函数。请在实验1做过的代码基础上修改。本实验没有提供示例代码。注:请将此实验编写的代码完整保存,此后的一项实验都要以本次实验的代码为基础。七、实验器材(设备、元器件):PC机一台,装有C/C++语言集成开发环境。八、实验步骤:实验要求:1.为各种形体类重载++运算符(包括前缀和后缀)2.为各种形体类重载++运算符(包括前缀和后缀),用于将它们的所有特征值加1。注意前缀和后缀形式上的区别;3.为各种形体类重载运算符,用以代替draw()操作。这需要用到友元;4.为各种形体类重载=运算符,用以完成两个相同类型形体对象的赋值;5.为List类重载=运算符,用以完成两个List对象间的赋值;6.为List类重载+=运算符,用以替代push_back()操作。不需要删除已定义好的push_back()成员函数。为实现以上要求:1)修改rect.h文件中代码如下(新增运算符重载代码):#ifndef__RECT__#define__RECT__classRectangle{public:stringname;//形体的标识Rectangle(intw=5,inth=7);~Rectangle();voiddraw();doublearea();stringwhat();/*为各种形体类重载++运算符(包括前缀和后缀)Start*/Rectangle&operator++(){++width;++height;return*this;}Rectangle&operator++(int/*占位参数*/){Rectangletemp(this-width,this-height);++width;++height;returntemp;}/*为各种形体类重载++运算符(包括前缀和后缀)End*///将作为友元重载friendostream&operator(ostream&os,constRectangle&c1);/*重载=运算符,用以完成两个相同类型形体对象的赋Start*/Rectangle&operator=(constRectangle&re){name=re.name;width=re.width;height=re.height;return*this;}/*重载=运算符,用以完成两个相同类型形体对象的赋End*/private:intwidth,height;//高和宽};#endif2)修改diamond.h文件中代码如下(新增运算符重载代码):#ifndef__DIAMOND__#define__DIAMOND__classDiamond{public:stringname;//形体的标识Diamond(intdjxf=35,intdjxs=37);~Diamond();voiddraw();doublearea();stringwhat();/*为各种形体类重载++运算符(包括前缀和后缀)Start*/Diamond&operator++(){++duijiaoxianf;++duijiaoxians;return*this;}Diamond&operator++(int/*占位参数*/){Diamondtemp(this-duijiaoxianf,this-duijiaoxians);++duijiaoxianf;++duijiaoxians;returntemp;}/*为各种形体类重载++运算符(包括前缀和后缀)End*///将作为友元重载friendostream&operator(ostream&os,constDiamond&c2);/*重载=运算符,用以完成两个相同类型形体对象的赋Start*/Diamond&operator=(constDiamond&di){name=di.name;duijiaoxianf=di.duijiaoxianf;duijiaoxians=di.duijiaoxians;return*this;}/*重载=运算符,用以完成两个相同类型形体对象的赋End*/private:intduijiaoxianf,duijiaoxians;//高和宽};#endif3)修改parallelogram.h文件中代码如下(新增运算符重载代码):#ifndef__PARALLELOGRAM__#define__PARALLELOGRAM__classParallelogram{public:stringname;//形体的标识Parallelogram(intw=15,inth=17);~Parallelogram();voiddraw();doublearea();stringwhat();/*为各种形体类重载++运算符(包括前缀和后缀)Start*/Parallelogram&operator++(){++width;++height;return*this;}Parallelogram&operator++(int/*占位参数*/){Parallelogramtemp(this-width,this-height);++width;++height;returntemp;}/*为各种形体类重载++运算符(包括前缀和后缀)End*///将作为友元重载friendostream&operator(ostream&os,constParallelogram&c3);/*重载=运算符,用以完成两个相同类型形体对象的赋Start*/Parallelogram&operator=(constParallelogram&pa){name=pa.name;width=pa.width;height=pa.height;return*this;}/*重载=运算符,用以完成两个相同类型形体对象的赋End*/private:intwidth,height;//高和宽};#endif4)保持quad.h文件中代码不变,不作修改5)修改square.h文件中代码如下(新增运算符重载代码):#ifndef__SQUARE__#define__SQUARE__classSquare{public:stringname;//形体的标识Square(intb=5);~Square();voiddraw();doublearea();stringwhat();/*为各种形体类重载++运算符(包括前缀和后缀)Start*/Square&operator++(){++bianchang;return*this;}Square&operator++(int/*占位参数*/){Squaretemp(this-bianchang);++bianchang;returntemp;}/*为各种形体类重载++运算符(包括前缀和后缀)End*///将作为友元重载friendostream&operator(ostream&os,constSquare&c4);/*重载=运算符,用以完成两个相同类型形体对象的赋Start*/Square&operator=(constSquare&sq){name=sq.name;bianchang=sq.bianchang;return*this;}/*重载=运算符,用以完成两个相同类型形体对象的赋End*/private:intbianchang;};#endif6)修改trapezoid.h文件中代码如下(新增运算符重载代码):#ifndef__TRAPEZOID__#define__TRAPEZOID__classTrapezoid{public:stringname;//形体的标识Trapezoid(intbf=4,intbs=5,inth=7);~Trapezoid();voiddraw();doublearea();stringwhat();/*为各种形体类重载++运算符(包括前缀和后缀)Start*/Trapezoid&operator++(){++bianchangf;++bianchangs;++height;return*this;}Trapezoid&operator++(int/*占位参数*/){Trapezoidtemp(this-bianchangf,this-bianchangs,this-height);++bianchangf;++bianchangs;++height;returntemp;}/*为各种形体类重载++运算符(包括前缀和后缀)End*///将作为友元重载friendostream&operator(ostream&os,constTrapezoid&c5);/*重载=运算符,用以完成两个相同类型形体对象的赋Start*/Trapezoid&operator=(constTrapezoid&tr){name=tr.name;bianchangf=tr.bianchangf;bianchangs=tr.bianchangs;height=tr.height;return*this;}/*重载=运算符,用以完成两个相同类型形体对象的赋End*/private:intbianchangf,bianchangs,height;};#endif7)修改List.h文件中代码如下(新增运算符重载代码):#ifndef__LIST__#define__LIST__#includequad.htypedefvoid(*ACCESSFUN)(QUADPTR);//定义遍历时节点处理函数类型structNode{QUADPTRdata;Node*next;};classList{private:Node*head,*tail;public:List();List(c