}
};
staticchar*str;
Stringoperator+(constString&a,constString&b)
{
strcpy(str,a.name);
strcat(str,b.name);
returnString(str);
}
voidmain()
{
str=newchar[256];
Stringdemo1("VisualC++");
Stringdemo2("6.0");
demo1.display();
demo2.display();
Stringdemo3=demo1+demo2;
demo3.display();
Stringdemo4=demo3+"Programming.";
demo4.display();
Stringdemo5="Programming."+demo4;
demo5.display();
deletestr;
}
(2)实验结果:
(3)程序分析:
考虑上述表达式:
demo3+“Programming.”
如果将此运算符重载为友元函数,则上述表达式被解释为:
operator+(demo3+“Programming.”)
然后编译程序将调用String类的构造函数将“Programming.”转换为String类的对象,最后被解释为:
operator+(demo3,String(“Programming.”))
匹配成员函数:
friendStringoperator+(constString&,constString&);
再考虑上述表达式:
“Programming.”+demo4
如果将此运算符重载为成员函数,则此表达式被解释为:
“Programming.”.operator+(demo4)
但“Programming.”不是一个对象,不能调用成员函数,所以编译系统将报告如下的错误:
errorC2677:
binary‘+’:
noglobaloperatordefinedwhichtakestype‘classString’(orthereisnoacceptableconversion)
如果将此运算符重载为友元函数,则上述表达式被解释为:
operator+(“Programming.”,demo4)
然后编译程序将调用String类的构造函数将“Programming.”转换为String类的对象,最后被解释为:
operator+(String(“Programming.”),demo4)
最后匹配成员函数:
friendStringoperator+(constString&,constString&);
四、实验收获与体会
本次实验主要练习了跟运算符重载有关的程序的调试编译。
通过本次实验,我更加深入地理解了运行时的多态性和编译时的多态性的概念,也能够正确掌握运算符重载的两种方法。
运算符重载的实质就是函数重载,重载运算符可以通过成员函数或者友元函数。
在实现过程中,首先把指定的运算符表达式转换为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型确定需要调用的函数,这个过程是在编译过程中完成的。