C语言试题、学习、考试大全38

上传人:宝路 文档编号:48368910 上传时间:2018-07-14 格式:PPT 页数:58 大小:316.37KB
返回 下载 相关 举报
C语言试题、学习、考试大全38_第1页
第1页 / 共58页
C语言试题、学习、考试大全38_第2页
第2页 / 共58页
C语言试题、学习、考试大全38_第3页
第3页 / 共58页
C语言试题、学习、考试大全38_第4页
第4页 / 共58页
C语言试题、学习、考试大全38_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《C语言试题、学习、考试大全38》由会员分享,可在线阅读,更多相关《C语言试题、学习、考试大全38(58页珍藏版)》请在金锄头文库上搜索。

1、目 录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 的关键技术之一。 在

2、C+中,多态性分为两种:静态多态 动态多态 函数重载和运算符重载属于静态多态。 函数重载:相同函数名可以完成不同功能。 运算符重载:相同运算符完成不同功能。 动态多态是指:程序执行过程中确定的关系,如动态确定函数的调用关系。 运行时的多态(动态多态)是通过类的继承和虚函数来实现的。13.1 函数重载 参见5.6节(略) 13.2 重载运算符 C+中所有的运算符都已预先定义了用法及意义。如:+ * / = 等,适用于已有的数据类型。 已定义的用法及意义是不允许用户改变的。 如果用户定义了新的数据类型,希望已定义的运算符能适应新的数据类型, 如: 前述 Complex 类的加法运算 Complex

3、 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 (

4、 ) 以 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); Comp

5、lex 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.oper

6、ator+(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:

7、.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

8、 解释为: 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.oper

9、ator + (c1) 友元实现:将 5.6 + c1解释为:operator + ( 5.6, c1)因此: 对一般的二元运算符重载为友元函数比重载为成员函数更优越。 但是对于赋值运算符,将其重载为成员函数较好,因为赋值运算符是一个二元运算符, 其语法格式为 =,第一个运算量必须是对象(变量也是对象),通过对象调用成员函数比较自然。 若重载为友元,则可能会出现5.6=c这样的表达式,与赋值表达式的语义不一致。 定义友元的目的是在友元函数中直接访问类的私有成员, 实际上,也可以通过公有函数接口访问类的私有成员, 所以实现运算符重载,可以即不用成员函数, 也不用友元函数。 class Compl

10、ex 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.S

11、etReal( 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.

12、何时必须重载 = 和 += 运算符? 相同类型的对象之间是可以直接赋值的,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.Scor

13、e = 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); /动态分配存储

14、空间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“)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号