




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录 F第1章 C+概述 F第2章 数据类型、运算符和表达式 F第3章 简单的输入/输出 F第4章 C+的流程控制 F第5章 函数 F第6章 编译预处理 F第7章 数组 F第8章 结构体、共同体和枚举类型 F第9章 指针和引用 F第10章 类和对象 F第11章 类和对象的其他特性 F第12章 继承和派生 F第13章 多态性 F第14章 输入/输出流 F第15章 模板 v第一部分 面向过程的程序设计 v第二部分 面向对象的程序设计 第13章 多态性 13.1 函数重载 13.2 运算符重载 13.3 静态联编 13.4 动态联编和虚函数 13.5 纯虚函数和抽象类 第 13 章 多态性 多态性是实现 OOP 的关键技术之一。 在C+中,多态性分为两种: 静态多态 动态多态 函数重载和运算符重载属于静态多态。 函数重载:相同函数名可以完成不同功能。 运算符重载:相同运算符完成不同功能。 动态多态是指:程序执行过程中确定的关系, 如动态确定函数的调用关系。 运行时的多态(动态多态) 是通过类的继承和虚函数来实现的。 13.1 函数重载 参见5.6节(略) 13.2 重载运算符 C+中所有的运算符都已预先定义了用法及意义。 如:+ * / = 等,适用于已有的数据类型。 已定义的用法及意义是不允许用户改变的。 如果用户定义了新的数据类型,希望已定义的运算符 能适应新的数据类型, 如: 前述 Complex 类的加法运算 Complex c1, c2, c3; c3 = add(c1, c2); /以前通过函数实现加法运算 c2.add(c3); / 或通过成员函数实现 c3 = c1 + c2; /能否直观地写成这样? 能 ! 运算符的重载可以达到此目的。 允许重载 和 不允许重载的运算符见13-1和13-2表。 13.2.1 运算符重载的几点说明 重载运算符的限制 (1)只能对已有运算符重载,不可臆造新的运算符。 (2)不允许改变运算符的优先级和结合性。 (3)不允许改变运算符的语法结构, 如二元运算符只能重载成二元运算符, 一元运算符只能重载成一元运算符。 1.重载为类的成员函数 在类内定义运算符重载函数的格式为: operator ( ) 以 operator 为关键字,编译器可以很容易将 运算符重载函数与其他成员函数区别开来。 例13.2 实现复数类的“+”,“-”等重载运算 关键部分见下页 13.2.2 运算符重载的两种方式 在类外定义运算符重载函数的格式为: :operator ( ) 特殊的成员函数名 class Complex float Real, Image; public: . Complex operator +(const Complex Complex operator +(double); Complex operator-(const Complex Complex operator-(double); Complex operator-(void); ; Complex Complex:operator +(const Complex Complex Complex:operator +(double r) return Complex(Real+r, Image); Complex Complex:operator-(void) return Complex(-Real, -Image); void main( ) Complex c1(2, 3), c2(4, -2), c3; c3 = c1+c2 ; c3 = c1+5 ; c3 = - c1; 编译器将 c1+c2 解释为:c1.operator+(c2) 将 c1+5 解释为:c1.operator+(5) 第1个运算量是对象,第2个运算量是参数。 阅读教材上程序全文(讲解略) 将 - c1 解释为:c1.operator( ) 当用成员函数实现运算符的重载时,重载函数的 参数个数只能是 0 个或 1 个。分别实现:一元、二元 运算符的重载。 2.重载为友元函数 例13.3 用友元函数实现复数类的“+”和“” 重载运算 关键部分见下页 在类内定义友元重载函数的格式为: friend operator ( ) 在类外定义友元重载函数的格式为: operator ( ) class Complex float Real, Image; public: . friend Complex operator +(const Complex friend Complex operator(const Complex ; Complex operator +(const Complex t.Real=c1.Real+c2.Real; t.Image=c1.Image+c2.Image; return t; Complex operator(const Complex c) /一元运算 return Complex(c.Real, c.Image) ; 不是类的成员函数 在 main( )函数中, 若有 Complex c1,c2; 则编译器将 c1+c2 解释为: operator+(c1, c2) 将 c1 解释为:operator(c1) 阅读教材上程序全文(讲解略) 当用友元函数实现运算符的重载时,重载函数的 参数个数只能是1 个或 2 个。 分别实现:一元运算符重载、二元运算符重载 3.两种重载方式的比较 成员实现:将 c1+c2 解释为:c1.operator +(c2) 友元实现:将 c1+c2 解释为:operator +(c1, c2) 成员实现:将 c1+5.6 解释为:c1.operator +(5.6) 友元实现:将 c1+5.6 解释为:operator +(c1, 5.6) 成员实现:将 5.6 + c1解释为: 5.6.operator + (c1) 友元实现:将 5.6 + c1解释为:operator + ( 5.6, c1) 因此: 对一般的二元运算符重载为友元函数比重载为成员函 数更优越。 但是对于赋值运算符,将其重载为成员函数较好,因 为赋值运算符是一个二元运算符, 其语法格式为 =, 第一个运算量必须是对象(变量也是对象),通过对象 调用成员函数比较自然。 若重载为友元,则可能会出现5.6=c这样的表达式,与赋 值表达式的语义不一致。 定义友元的目的是在友元函数中直接访问类的私有成员, 实际上,也可以通过公有函数接口访问类的私有成员, 所以实现运算符重载,可以即不用成员函数, 也不用友元函数。 class Complex float Real, Image; public: Complex(double r=0, double i=0) Real=r; Image=i; void SetReal(double Real) Complex:Real = Real; void SetImage(double Image) Complex:Image = Image; double GetReal( ) return(Real); double GetImage( ) return(Image); ; 4.使用非成员、非友元实现运算符的重载 例13.4: Complex operator +(Complex t.SetReal( c1.GetReal( )+c2.GetReal( ) ); t.SetImage( c1.GetImage( )+c2.GetImage( ) ); return t; void main( ) Complex c1(2, 3), c2(4, 8), c3; c3 = c1+c2; c3.Show( ); 编译器将 c1+c2 解释为: operator +(c1, c2) 对于Complex类,如有Complex c1(2, 3), c2; 则自动将 c2=c1; 处理成: c2.Real = c1.Real; c2.Image = c1. Image; 一般不会出现问题。 5. 何时必须重载 = 和 += 运算符? 相同类型的对象之间是可以直接赋值的,C+将赋 值处理成两个对象的各个成员直接赋值。两个对象的 对应数据成员逐一赋值。 例13.5 在类中,用字符数组实现字符串。 见 “第13章 多态性(例子).doc” Num数组 Name数组 Score整数 stud1存储空间 Num数组 Name数组 Score整数 stud2存储空间 程序中A行使用赋值运算符进行对象整体赋值, C+将其处理成各个成员逐一赋值,如下图所示: : C+默认的处理是:strcpy(stud2.Num, stud1.Num); strcpy(stud2.Name, stud1.Name); stud2.Score = stud1.Score; 。 但是如果对象的成员中有成员指向动态分配的 数据空间就会出现问题。 例13.6 在类中,用指针实现字符串, 即字符串的空间是动态分配的。 class Student char *Nump; /学号,注意:用指针实现 char *Namep; /姓名,注意:用指针实现 int Score; /成绩 public: Student(char *nump=NULL, char *namep=NULL, int score=0) if(nump) /构造函数 Nump = new charstrlen(nump)+1; strcpy(Nump, nump); /动态分配存储空间 else Nump=NULL; if(namep) Score=score; Student( ) / 析构函数,释放指针指向的空间 if(Nump)delete Nump; if(Namep)delete Namep; void Show( ) if(Nump public: Complex(double r=0, double i=0) Real=r; Image=i; operator double ( ) / A 类型转换函数, / 将 Complex 类转换成 double 类 return Real; ; void main( ) Complex c(3,2); double x; x = c; / B cout :operator+ ( ) . 重载后置 + 运算符的成员函数的一般格式为: :operator+ (int) . int 用于区分,没有实际意义, 可给出实参,也可以不给出实参。 重载前置 + 运算符的友元函数的一般格式为: friend operator+ ( strcpy(s1, s2); /不能写成 s1= s2; strcat(s1, s2); /不能写成 s1= s1+s2; 能否定义一个字符串类:String 实现: String s1(“abc“), s2(“123“), s3; s1 = s2; s3 = s1 + s2; 能! 可以利用C+提供的运算符重载实现。 例13.18 定义字符串类String,并测试重载的运算符 以及成员函数 程序见 “第13章 多态性(例子).doc”,或阅读教材上的 程序。 重点讲解: (1) 说明:函数名后的 const (2) (拷贝)构造函数,在主函数中如何使用? (3) 重载赋值 = 运算符 (4) 重载 + 运算符 (5) 类型转换函数 operator const char * (6) 删除子串图示见下页 删除子串: String operator - (const String double add(double a, double b) /重载函数2 return(a+b); void main( ) cout ( ) 13.4.1 虚函数 重点讲解: double CalcArea(Point /A Area( )是虚函数 void main( ) Point p(1, 2); Rectangle r(0, 0, 1, 1); Circle c(0, 0, 1); coutfun3( ); /E B b; b.fun1( ); / 调用A类的fun1( )和fun2( ),在A类的fun2( )函数中, / 在E行, this 是指向b的指针, 所以调用B的fun3( )函数 class A public: A( ) fun( ); virtual void fun( ) cout class A char *Aptr; public: A( ) Aptr = new char100; A( ) /析构函数不是虚函数 delete Aptr; cout ( ) = 0 ; 没有函数体。函数参数列表圆括号后面的“= 0”, 表示将函数名的值赋予0。 例13.27 定义抽象类,派生出若干类, 在派生类中实现纯虚函数。 程序见 “第13章 多态性(例子).doc”, 或阅读教材上的程序。 Point R
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国医用组织引导再生胶原膜数据监测研究报告
- 无锡莫来石轻质砖施工方案
- 2025至2030年中国中继联号器数据监测研究报告
- 2025至2030年中国B型超生诊断仪及探头数据监测研究报告
- 2025年中国高速精密间隙分割器市场调查研究报告
- 初中入学考题数学试卷
- 2025年中国礼仪用品市场调查研究报告
- 2025年中国按摩透气活性炭鞋垫市场调查研究报告
- 2025年中国外螺纹套管市场调查研究报告
- 信息的数字化(教学设计)2024-2025学年四年级上册信息技术苏科版
- 工程结构质量特色介绍
- 超全六年级阴影部分的面积(详细答案)
- 提高护士对抢救药品知晓率PDCA案例精编版
- 八字万能速查表(有图)
- 清华大学MBA课程——运筹学
- 架桥机安全教育培训试卷及答案(共3页)
- 湿法冶金浸出净化和沉积PPT课件
- 通信杆路工程施工
- 初中物理光学经典题(共23页)
- 化学反应工程流固相非催化反应PPT课件
- 二次回路和电缆编号原则
评论
0/150
提交评论