1、C+实验报告十二VC+程序设计实验报告 实验十二题目:运算符重载 专 业 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 日 期 教师评语 教师签名: 年 月 日成绩评定备 注一、实验目的1. 理解运行时的多态性和编译时的多态性2掌握运算符重载的两种方法二、实验内容1. 验证例6.2,根据课本上的程序分析,验证分析结果2. 验证例6.43. 理解几个常用的运算符重载实例三、实验结果及其结果分析例6.2(1) 源程序:#include#includeclass String char name256;public: String(char * str) strcpy(name,s
2、tr); String() String() String operator + (const String&); void display() coutThe string is:nameendl; ;static char * str;String String:operator + (const String& a) strcpy(str,name); strcat(str,a.name); return String(str);void main() str=new char256; String demo1(Visual C+); String demo2(6.0); demo1.d
3、isplay(); demo2.display(); String demo3=demo1+demo2; demo3.display(); String demo4=demo3+Programming.; demo4.display(); delete str;(2) 实验结果:(3) 程序分析:考虑上述表达式:demo3 + “Programming.”如果将此运算符重载为成员函数,则上述表达式被解释为:demo3.operator + (“Programming.”)然后编译程序将调用String类的构造函数将“Programming.”转换为String类的对象,最后被解释为: demo
4、3.operator + (String(“Programming.”)匹配如下的成员函数得最后结果:String operator + (const String&);operator+函数体中的最后一条语句return String(str);执行时不调用拷贝构造函数。但是若此函数定义改为:String String:operator + (const String &a) String s; strcpy(s.name,name); strcat(s.name,a.name); return s;则返回s时要调用拷贝构造函数。main()函数中的语句String demo3=demo1+
5、demo2;不调用对赋值号的重载函数,也不调用拷贝构造函数创建demo3,这只是初始化语句,如果把该语句改为:string demo3;demo3=demo1+demo2;这时会调用对的重载函数。例6.4(1) 源程序:#include#includeclass String char name256;public: String(char * str) strcpy(name,str); String() String() friend String operator + (const String&,const String&); void display() coutThe string
6、 is:nameendl; ;static char * str;String operator + (const String& a,const String& b) strcpy(str,a.name); strcat(str,b.name); return String(str);void main() str=new char256; String demo1(Visual C+); String demo2(6.0); demo1.display(); demo2.display(); String demo3=demo1+demo2; demo3.display(); String
7、 demo4=demo3+Programming.; demo4.display(); String demo5=Programming.+demo4; demo5.display(); delete str;(2) 实验结果:(3)程序分析:考虑上述表达式:demo3 + “Programming.”如果将此运算符重载为友元函数,则上述表达式被解释为:operator + (demo3 + “Programming.”)然后编译程序将调用String类的构造函数将“Programming.”转换为String类的对象,最后被解释为:operator + (demo3,String(“Prog
8、ramming.”)匹配成员函数:friend String operator + (const String&,const String&);再考虑上述表达式:“Programming.”+ demo4如果将此运算符重载为成员函数,则此表达式被解释为:“Programming.”.operator + (demo4)但“Programming.”不是一个对象,不能调用成员函数,所以编译系统将报告如下的错误:error C2677:binary+:no global operator defined which takes typeclass String(or there is no acc
9、eptable conversion)如果将此运算符重载为友元函数,则上述表达式被解释为:operator + (“Programming.”,demo4)然后编译程序将调用String类的构造函数将“Programming.”转换为String类的对象,最后被解释为:operator + (String(“Programming.”),demo4)最后匹配成员函数:friend String operator + (const String&,const String&);四、实验收获与体会本次实验主要练习了跟运算符重载有关的程序的调试编译。通过本次实验,我更加深入地理解了运行时的多态性和编译时的多态性的概念,也能够正确掌握运算符重载的两种方法。运算符重载的实质就是函数重载,重载运算符可以通过成员函数或者友元函数。在实现过程中,首先把指定的运算符表达式转换为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型确定需要调用的函数,这个过程是在编译过程中完成的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1