已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 运算符重载及多态,吴良杰,harbin engineering university,运算符重载实例,复数的运算 class complex public: complex(double r=0.0,double i=0.0) real=r; imag=i; void display() coutreal“,”imagendl; private: double real; double imag; ;,运算符重载,问题: 1) 用“+”、“-”能够实现复数的加减运算吗? 2) 如何实现复数加减运算? 重载“+”、“-”运算符 complex operator + (const complex,运算符重载,运算符重载 对已有的运算符赋予多重含义 必要性 c+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类) 实现机制 将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。 编译系统对重载运算符的选择,遵循函数重载的选择原则。,运算符重载,两种形式 重载为类成员函数 声明形式 函数类型 operator 运算符(形参) 重载为友元函数 声明形式 friend 函数类型 operator 运算符(形参) ,运算符重载重载为成员函数,例: 将“+”、“-”运算重载为复数类的成员函数。 规则: 实部和虚部分别相加减。 操作数: 两个操作数都是复数类的对象。,运算符重载重载为成员函数,#include class complex public: complex(double r=0.0,double i=0.0) real=r;imag=i; complex operator + (complex c2); complex operator - (complex c2); void display() coutreal“, “imagendl; private: double real,imag; ;,运算符重载重载为成员函数,complex complex:operator +(complex c2) complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex(c.real,c.imag); complex complex:operator -(complex c2) complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); ,运算符重载重载为成员函数,void main() complex c1(5,4),c2(2,10),c3; cout“c1=“; c1.display(); cout“c2=“; c2.display(); c3=c1-c2; cout“c3=c1-c2=“; c3.display(); c3=c1+c2; cout“c3=c1+c2=“; c3.display(); ,运算符重载重载为成员函数,声明形式 函数类型 operator 运算符(形参) complex complex:operator +(complex c2) complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex(c.real,c.imag); ,运算符重载重载为成员函数,重载为类成员函数时 参数个数=原操作数个数-1 (后置+、-除外) 双目运算符 b 表达式:oprd1 b oprd2 b:重载运算符 oprd1: a 类对象 oprd2: 形参 重载后: oprd1 b oprd2 oprd1.operator b(oprd2),运算符重载重载为成员函数,前置单目运算符 u 表达式 : u oprd oprd :对象 u :重载为无形参的成员函数, 重载后: 表达式 u oprd 相当于 oprd.operator u() 后置单目运算符: +和- 表达式 oprd+ 或 oprd- +或- :被重载为具有一个 int 类型 形参的成员函数。 重载后: oprd+ 相当于 oprd.operator +(0),运算符重载重载为成员函数,例:将运算符前置+和后置+重载为时钟类的成员函数。 操作数:时钟类的对象 功能:实现时间增加1秒钟 class clock public: clock(int newh=0, int newm=0, int news=0); void showtime(); clock operator +(); clock operator +(int); private: int hour,minute,second; ;,运算符重载重载为成员函数,clock clock:operator +() second+; if(second=60) second=second-60; minute+; if(minute=60) minute=minute-60; hour+; hour=hour%24; return *this; ,运算符重载重载为成员函数,clock clock:operator +(int) clock old=*this; +(*this); return old; /后置自增表达式的值是变量的原值 。 ,运算符重载重载为成员函数,void main() clock myclock(23,59,59); /定义对象 cout“first time output:“; myclock.showtime(); /显示时间 cout“show myclock+:“; (myclock+).showtime(); /时间自增(后置) cout“show +myclock:“; (+myclock).showtime(); /时间自增(后置) ,程序运行结果为: first time output: 23:59:59 show myclock+: 23:59:59 show +myclock: 0:0:1,运算符重载重载为友元函数,#include class com public: com (double r=0.0,double i=0.0) real=r; imag=i; friend com operator + (com c1,com c2); friend com operator - (com c1,com c2); void display(); private: double real; double imag;,com operator +(com c1,com c2) return com(c2.real+c1.real, c2.imag+c1.imag); com operator -(com c1,com c2) return com(c1.real-c2.real, c1.imag-c2.imag); ,运算符重载重载为友元函数,void com:display() cout“(“real“,“imag“)“endl; void main() com c1(5,4),c2(2,10),c3; cout“c1=“; c1.display(); cout“c2=“; c2.display(); c3=c1-c2; cout“c3=c1-c2=“; c3.display(); c3=c1+c2; cout“c3=c1+c2=“; c3.display(); ,c3=operator (c1,c2);,c3=operator +(c1,c2);,程序输出的结果为: c1=(5,4) c2=(2,10) c3=c1-c2=(3,-6) c3=c1+c2=(7,14),运算符重载重载为友元函数,声明形式 friend 函数类型 operator 运算符(形参) 形参: 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。,运算符重载重载为友元函数,双目运算符 b重载 表达式oprd1 b oprd2 等同于operator b(oprd1,oprd2 ) 前置单目运算符 b重载 表达式 b oprd 等同于operator b(oprd ) 后置单目运算符 +和-重载 表达式 oprd b 等同于operator b(oprd,0 ),运算符重载规则,1)可以重载c+中除下列运算符外的所有运算符: . .* : ?: 2)只能重载c+语言中已有的运算符,不可臆造新的。 3)不改变原运算符的优先级和结合性。 4)不能改变操作数个数。 5)经重载的运算符,其操作数中至少应该有一个是自定义类型。,多态性,什么是多态性? 一词多意 多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。 多态性表现形式 1) 不同的对象在收到相同的消息时,产生不同的动作; 2) 同一对象收到相同的消息却产生不同的函数调用。,多态性,类型 重载多态 强制转换多态 包含多态 参数多态 实现 函数重载 运算符重载 虚函数,虚函数,#include class b0 public: void display() cout“b0:display()“endl; ; class b1: public b0 public: void display() cout“b1:display()“endl; ; class d1: public b1 public: void display() cout“d1:display()“endl; ;,void main() b0 b0,*pb0; b1 b1; d1 d1; pb0=,运行结果: b0:display() b0:display() b0 :display(),虚函数,问题: 如何通过基类指针访问派生类中同名的成员函数? 解决方法: 使用虚函数。 什么是虚函数? 一个类的非静态成员函数。 声明时使用virtual关键字限定。,虚函数,声明 virtual 返回值类型 函数名(参数表) 函数体 说明 virtual只能出现在函数声明语句中, 不能出现在实现时。,虚函数,#include class b0 public: virtual void display() cout“b0:display()“endl; ; class b1: public b0 public: void display() cout“b1:display()“endl; ; class d1: public b1 public: void display() cout“d1:display()“endl; ;,27,void main() b0 b0,*pb0; b1 b1; d1 d1; pb0=,运行结果: b0:display() b1:display() d1:display(),虚函数,虚函数特点: 当一个类的某个成员函数被声明为虚函数,则由该类派生出来的所有派生类中,该函数始终保持虚函数的特征。 使用要点 当在派生类中重新定义虚函数时,不必加关键字virtual。但重新定义时不仅要同名,而且它的参数表和返回类型全部与基类中的虚函数一样,否则出错。,虚函数虚析构函数,何时需要虚析构函数? 当通过基类指针删除派生类对象时 通过基类指针调用对象的析构函数,并且被析构的对象是有重要的析构函数的派生类的对象,就需要让基类的析构函数成为虚拟的。,模板,问题:为什么要使用模板? 举例:计算两个整型数的加法和 两个实型数加法。 解决方法:函数重载 缺点:函数要写再次。 如何克服缺点:使用函数模板 如一个食品模型,填充不同的原料,得到不同名称的食品。,模板函数模板,作用: 创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。 声明: template 函数声明,模板函数模板,#include template t sum(t x,t y,t z) return x+y+z; template t sum (t x,t1 y) return x+y; void main() coutsum(2,a)endl; coutsum(a,2)endl; coutsum(2,5,7)endl;coutsum(1.2,5.0,7.5)endl; ,模板类模板,作用: 类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。,模板类模板,template class store private: t item; int havevalue; public: store(void); t getelem(void); void putelem(t x); ;,模板类模板,template store:store(void): havevalue(0) template t store:getelem(void) if (havevalue = 0)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- YY/T 1539-2025医用洁净工作台
- 重庆西南大学附中2025-2026学年化学高一第一学期期中达标检测模拟试题含解析
- 互联网金融行业互联网金融服务
- 经济学毕业论文选题
- 存在的主要问题与对策建议
- 交大安泰MBA毕业论文汇报模板学术版29
- 人工智能下大学生就业现状及对策
- 浅析以人民为中心的重要性
- 2025-2025第二学期文学与传媒学院教学督导工作总结
- 研究生毕业论文导师评语
- 幼儿园动火审批制度
- 冲压车间安全培训
- 肝血吸虫病超声
- 食品加工机械与设备题库+参考答案
- 【7上英WY】合肥市蜀山区2024-2025学年七年级上学期期中考试英语试卷
- 简约蓝色保安交接班记录表
- 债务重组垫资协议书范本
- 罻网络空间治理与法律法规
- 专题02 数轴上动点问题的三种考法(解析版)-2024年常考压轴题攻略(7年级上册人教版)
- 抑郁病诊断证明书
- SL+174-2014水利水电工程混凝土防渗墙施工技术规范
评论
0/150
提交评论