资源描述:
《C++课件教学作者邱志杰第五章_多态性.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第五章多态性丘志杰电子科技大学计算机学院2021/9/12多态性的分类编译时的多态运行时的多态函数重载运算符重载虚函数2021/9/13运算符重载的引入使用C++编写程序时,我们不仅要使用基本数据类型,还要设计新的数据类型—类类型。一般情况下,基本数据类型的运算都是用运算符来表达,这很直观,语义也简单。例如:inta,b,c;a=b+c;2021/9/14对于基本数据类型,就隐含着运算符重载的概念。inta,b,c;c=a+b;moveax,dwordptr[ebp-4]addeax,dwordptr[ebp-8]movdwordptr[eb
2、p-0Ch],eaxfloata,b,c;c=a+b;flddwordptr[ebp-4]fadddwordptr[ebp-8]fstpdwordptr[ebp-0Ch]2021/9/15需要一种机制来重新定义运算符作用在类类型上的含义。如果直接将运算符作用在类类型之上,情况又如何呢?例如:Counterret,c1,c2;ret=c1+c2;编译器将不能识别运算符的语义。这种机制就是运算符重载。2021/9/16例子:复数的加运算classComplex{doublere,im;public:Complex(doubler=0.0,doub
3、lei=0.0):re(r),im(i){}Complexadd(Complexc){Complext;t.re=re+c.re;t.im=im+c.im;returnt;}};voidmain(){Complexc1(1,2),c2(3,4);Complexc3=c1.add(c2);}“c3=c1.add(c2);”这种方式不直观我们更希望是如下方式:c3=c1+c2;2021/9/17例子:重载复数类的加运算符voidmain(){Complexc1(1,2),c2(3,4);Complexc3=c1+c2;}classComplex{
4、……public:Complexoperator+(Complexc){Complext;t.re=re+c.re;t.im=im+c.im;returnt;}};//相当于c3=c1.operator+(c2);称为operator+(…)函数的隐式调用称为operator+(…)函数的显示调用称operator+(…)为运算符重载函数将运算符重载为成员函数形式2021/9/18用成员函数重载运算符可能会碰到的麻烦classComplex{……public:Complexoperator+(Complexc){Complext;t.re=r
5、e+c.re;t.im=im+c.im;returnt;}};voidmain(){Complexc1(1,2);c1=c1+27;c1=27+c1;}//正确,相当于c1=c1.operator+(Complex(27))//错误,被理解为无意义的c1=27.operator+(c1)2021/9/19用友元函数形式实现运算符重载classComplex{……public:friendComplexoperator+(Complexc1,Complexc2);};Complexoperator+(Complexc1,Complexc2){C
6、omplext;t.re=c1.re+c2.re;t.im=c1.im+c2.im;returnt;}voidmain(){Complexc1(1,2);c1=c1+27;c1=27+c1;}//正确,相当于c1=operator+(Complex(27),c1)//正确,相当于c1=operator+(c1,Complex(27))请思考,能否同时存在以下两个函数:Complexoperator+(Complexc){…}friendComplexoperator+(Complexc1,Complexc2){…}将27隐式转换为Comple
7、x类型2021/9/110如果要显示复数对象,如何办?classComplex{……public:doublegetRe(){returnre;}doublegetIm(){returnim;}};intmain(){Complexobj(3,4);cout<8、r<<(ostream&out,Complex&obj);};ostream&operator<<(ostream&out,Complex&obj){out<