




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 面向对象程序设计-多态性 多态性多态性 多态性概述多态性概述 运算符重载运算符重载 面向对象程序设计-多态性 多态性概述多态性概述 通俗地说,多态性是指用一个相同的名字定义不同的函数,这些函数的执行过程不同,但是有相似的操作,即用同样的接口访问不同的函数。 面向对象程序设计-多态性 多态性概述多态性概述 面向对象的多态性从实现的角度来讲,可以分为静态多态性和动态多态性两种。静态多态性是在编译的过程中确定同名操作的具体操作对象的,而动态多态性则是在程序运行过程中动态地确定操作所针对的具体对象的。这种确定操作具体对象的过程就是联编(binding),也称为绑定。 面向对象程序设计-多态性 联编是
2、指计算机程序自身彼此关联的过程。也就是把一个标识符名和一个存储地址联系在一起的过程。用面向对象的术语讲,就是把一条消息和一个对象的方法相结合的过程。所谓消息,是指对类的成员函数的调用。所谓消息,是指对类的成员函数的调用。不同的方法是指不同的实现,也就是调不同的方法是指不同的实现,也就是调用了不同的函数用了不同的函数。按照联编进行阶段的不同,联编方法可以分为两种:静态联编和动态联编。多态性概述多态性概述 面向对象程序设计-多态性 这两种联编过程分别对应着多态的两种实现方式。联编工作在编译连接阶段完成的情况称为静态联编。在编译、连接过程中,系统就可以根据类型匹配等特征确定程序中操作调用与执行该操作
3、的代码的关系,即确定某一个同名标识到底是要调用哪一段程序代码。函数重函数重载和运算符重载就属于静态多态性载和运算符重载就属于静态多态性。 多态性概述多态性概述 面向对象程序设计-多态性 和静态联编相对应,如果联编工作在程序运行阶段完成,则称为动态联编。在编译、连接过程中无法解决的联编问题,要等到程序开始运行之后再来确定。例如,本章将要介绍的虚函数就是通过动态联编完成的。 函数重载在函数及类的章节中曾做过详细的讨论,所以在本章中,静态多态性主要介绍运算符重载;对于动态多态性,将对虚函数作详细介绍。 多态性概述多态性概述 面向对象程序设计-多态性 C+中预定义的运算符的操作对象只能是基中预定义的运
4、算符的操作对象只能是基本数据类型。本数据类型。实际上,对于很多用户自定义的类型(如类),也需要有类似的运算操作。例如坐标点类point。 静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 静态多态性静态多态性-运算符重载运算符重载class point int x , y; public: point ( int xx=0,int yy =0) x = xx ; y = yy ; /. ; 面向对象程序设计-多态性 声明点类的对象: point p1(1,1) , p2(3,3) 如果我们需要对p1和p2进行加法运算,如果写出表达式“p1+p2”,编译时却会出错,因为编译器
5、不知道该如何完成这个加法。这时我们就需要编写程序来说明“+”怎样作用于point类对象时,该实现什么样的功能,这就是运算符重载。静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 运算符重载是对已有的运算符赋予多重含运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,义,使同一个运算符作用于不同类型的数据时,导致不同类型的行为导致不同类型的行为。 在运算符重载的实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后,根据实参的类型来确定需要调用的函数。这个过程是在编译过程中完成的。静态多态性静态多态性-运算符
6、重载运算符重载 面向对象程序设计-多态性 * 运算符重载的规则 运算符重载时必须要遵守一定的规则。 C+中的运算符除了少数几个(类属关系运算符“.”、作用域分辨符“:”、成员指针运算符“.*”、sizeof运算符和三目运算符“?:”)之外,全部可以重载,而且只能重载C+中已有的运算符,不能臆造新的运算符。 静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 重载之后运算符的优先级和结合性都不能改变,也不能改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 运算符重载后的功
7、能应当与原有功能相类似 重载运算符含义必须清楚,不能有二义性。 运算符的重载形式有两种:重载为运算符的重载形式有两种:重载为类的成员函数和重载为类的友元函数。类的成员函数和重载为类的友元函数。静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 运算符重载为类的成员函数的一般语法形式如下:运算符重载为类的成员函数的一般语法形式如下: operator (形参表形参表) 函数体;函数体; 运算符重载为类的友元函数的一般语法形式如下:运算符重载为类的友元函数的一般语法形式如下: friend operator (形参表形参表) 函数体;函数体; 静态多态性静态多态性-运算符重载运算
8、符重载 面向对象程序设计-多态性 其中: 函数类型指定了重载运算符的返回值类型,也就是运算结果类型。 operator是定义运算符重载函数的关键字。 运算符是要重载的运算符名称。 形参表给出重载运算符所需要的参数和类型。 friend是对于运算符重载为友元函数时,在函数类型说明之前使用的关键字。 静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 特别需要注意的是,当运算符重载为类的特别需要注意的是,当运算符重载为类的成员函数时,函数的参数个数比原来的操作数成员函数时,函数的参数个数比原来的操作数个数要少一个个数要少一个(后置后置“+”、“-”除外除外);当重;当重载为类的友
9、元函数时,参数个数与原操作数的载为类的友元函数时,参数个数与原操作数的个数相同。个数相同。原因是重载为类的成员函数时,如原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。行传递,少了的操作数就是该对象本身。静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 * 运算符重载为成员函数 运算符重载实质上就是函数重载运算符重载实质上就是函数重载,当运算符重载为成员函数之后,它就可以自由地访问本类的数据成员了。
10、实际使用时,总是通过该类的某个对象来访问重载的运算符。如果是双目运算符,一个操作数是对象本身的数据,由this指针指出,另一个操作数则需要通过运算符重载函数的参数表来传递;静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 如果是单目运算符,操作数由对象的this指针给出,就不再需要任何参数。下面分别介绍这两种情况。 双目运算符所属的类型。经过重载之后,表达式oprdl B oprd2就相当于函数调用oprdl.operator B (oprd2)。静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 1双目运算:oprdl B oprd2 对于双目运算符B,
11、如果要重载B为类的成员函数,使之能够实现表达式oprdl B oprd2(其中oprdl为A类的对象),则应当把B重载为A类的成员函数,该函数只有一个形参,形参的类型是oprd2静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 【例1】双目运算符重载为成员函数例题。#includeclass point private: float x,y; public: point(float xx=0,float yy=0):x(xx),y(yy) float get_x()return x; float get_y()return y; 静态多态性静态多态性-运算符重载运算符重载
12、面向对象程序设计-多态性 point operator+(point p1); point operator-(point p1); /重载运算符“+”和“-”为成员函数;point point:operator+(point q) return point(x+q.x,y+q.y);point point:operator-(point q) return point(x-q.x,y-q.y);静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 void main() point p1(3,3),p2(2,2),p3,p4 p3=p1+p2; /两点相加 p4=p1-p2;
13、 /两点相减 coutp3.get_x()“ p3.get_y()endl; coutp4.get_x()“ p4.get_y()endl; 静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 本例中重载的“+”、“-”函数中,都是创建一个临时的无名对象作为返回值: return point(x+q.x,y+q.y); 这表面上看起来像是对构造函数的调用,但其实并非如此。这是临时对象语法,它的含义是创建一个临时对象并返回它。静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 当然,也可以按如下形式返回函数值: point point:operator+(po
14、int q) point p; p.x=x+q.x; p.y=y+q.y; return p; 静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 这两种方法的执行效率是完全不同的。后者的执行过程是这样的:创建一个局部对象p(这时会调用构造函数),执行return语句时,会调用拷贝构造函数,将p的值拷贝到主调函数中的一个无名临时对象中。当函数operator+结束时,会调用析构函数析构对象p,然后p消亡。两种方法相比,前一种方法的效率高,因为它是直接将一个无名临时对象创建到主调函数中静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 练习 有两个矩阵类(ma
15、rtix)对象a和b,均为行列,求两个矩阵之和。重载运算符“”,使之能用于矩阵相加。如ab。静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 2单目运算 1)前置单目运算:U oprd 对于前置单目运算符U,如“-”(负号)、“+”等,如果要重载U为类的成员函数,用来实现表达式U oprd(其中oprd为A类的对象),则U应当重载为A类的成员函数,函数没有形参。经过重载 之 后 , 表 达 式 U o p r d 相 当 于 函 数 调 用oprd.operator U()。 静态多态性-运算符重载 面向对象程序设计-多态性 例如,前置单目运算符“+”重载的语法形式如下:
16、operator+(); 使用前置单目运算符“+”的语法形式如下: +;静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 2) 后置单目运算:opr dV 再来看后置运算符V,如“+”和“-”,如果要将它们重载为类的成员函数,用来实现表达式oprd+或oprd-(其中oprd为A类的对象),那么运算符就应当重载为A类的成员函数,这时函数要带有一个整型(int)形参。重载之后,表达式oprd+和oprd-就相当于函数调用oprd.operator+(0)和oprd.operator-(0)。 静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 例如,后置单目
17、运算符“+”重载的语法形式如下: operator+(int); 使用后置单目运算符“+”的语法形式如下: +;静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 在在C+中中,可以通过在运算符函数参数表中是否插可以通过在运算符函数参数表中是否插入关键字入关键字int来区分前缀和后缀这两种方式。来区分前缀和后缀这两种方式。 对于前缀方式对于前缀方式+ob,可以用运算符函数重载为可以用运算符函数重载为 ob.operator +(); / 成员函数重载成员函数重载 或或 operator + (X& ob); / 友元函数重载友元函数重载, 其中其中ob为类为类X对象的
18、引用。对象的引用。 静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 对于后缀方式对于后缀方式ob+,可以用运算符函数重载为可以用运算符函数重载为 ob. operator +(int); / 成员函数重载成员函数重载 或或 operator+(X& ob,int); / 友元函数重友元函数重载载在调用后缀方式的函数时在调用后缀方式的函数时,参数参数int一般被传递给一般被传递给值值0。静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 【例2】单目运算符重载为成员函数例题。 #includeclass point private:float x,y; 静态多态性静态多态性-运算符重载运算符重载 面向对象程序设计-多态性 public:point(float xx=0,float yy=0)x=xx;y=yy;float get_x()return x;float get_y()return y; point operator+(); /重载前置运算符“+”point operator-();/重载前置运算符“-”;静
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国水性环氧漆项目经营分析报告
- 中国海绵钛项目经营分析报告
- 中国衣物柔顺剂项目创业计划书
- 中国流式荧光试剂项目创业计划书
- 中国基础化工项目商业计划书
- 沈阳铝镁设计研究院有限公司-企业报告(业主版)
- 贸易产品知识培训内容课件
- 中国化肥农药项目创业计划书
- 走走走课件教学课件
- 读有感课件教学课件
- 质检主管工作汇报
- 应急演练方案脚本大全
- 军队文职课件
- 2025年资料员考试题库含完整答案
- 格拉斯哥评分课件
- 工会小组长课件
- 体育老师读书分享:运动与人生
- 2025年中学校规校纪及教育惩戒实施细则
- 预防接种课件讲稿
- CAAC无人机理论考试题库(2025修订版)(含答案)
- 2024年重庆航天职业技术学院公开招聘辅导员笔试题含答案
评论
0/150
提交评论