C++程序设计(第二版)-电子教案-杨长兴 第7章 重载与模板

上传人:E**** 文档编号:89423729 上传时间:2019-05-25 格式:PPT 页数:24 大小:322.50KB
返回 下载 相关 举报
C++程序设计(第二版)-电子教案-杨长兴 第7章 重载与模板_第1页
第1页 / 共24页
C++程序设计(第二版)-电子教案-杨长兴 第7章 重载与模板_第2页
第2页 / 共24页
C++程序设计(第二版)-电子教案-杨长兴 第7章 重载与模板_第3页
第3页 / 共24页
C++程序设计(第二版)-电子教案-杨长兴 第7章 重载与模板_第4页
第4页 / 共24页
C++程序设计(第二版)-电子教案-杨长兴 第7章 重载与模板_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《C++程序设计(第二版)-电子教案-杨长兴 第7章 重载与模板》由会员分享,可在线阅读,更多相关《C++程序设计(第二版)-电子教案-杨长兴 第7章 重载与模板(24页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计(第二版),主编 杨长兴 刘卫国 中国水利水电出版社,第7章,重载与模板,7.1重载,重载含函数重载与运算符重载 7.1.1函数重载 引入原因 重载指用同一个函数名对应着多个函数实现的情况。 如:求两个数的较大值,若数的类型不同,则返回值类型不同。 int max(int,int); float c=max(3.14,3.5); /error 因此一个定义了实现整型数比较功能的函数无法用于实现实型数的比较,尽管其功能一致。 这时就可采用重载。,在C+中,允许两个或两个以上的函数采用相同的名字,只要使用不同类型、不同数目的参数或不同的返回值,编译器便知道在什么情况下该调用哪个函数,这

2、就叫函数重载。 如:int max (int x, int y) return ( (xy) ? x: y); double max (double x , double y) return ( (xy) ?x: y); #include void main( ) coutmax(10,20)endl; coutmax(1.23,2.34)endl; ,重载方式,靠将实参的个数及类型和所被调用的f()函数的形参的个数及类型一一比较来判断。,()作为重载函数至少在参数个数、参数类型上有所不同。若仅在返回类型上不同,编译器是无法区别的。 如:void func(int); int func(int

3、); /错误 int min(int ,int); int min(int,int,int); /正确 int add(int,int); double add(double,double); /正确 ()typedef定义的类型只是给已有类型取另外一个名字,编译器不能将其同原类型区分。如: typedef INT int; void func(int x) . void func (INT x) (3)重载函数一般应具有相同的功能,否则会破坏程序的可读性。,注意事项,问题的提出 1、基本数据类型系统提供了大量运算符。 如:int x,y; x=x+y; 表达简洁,使用方便。 2、问题的提出:

4、 对于串类的对象合并: string x, y; strcat(x,y);不如上述运算那样简单,希望能改造为:x=x+y;更加简单和直观! 因此,需要对“+”进行不同的解释,即:重载,7.1.2 运算符重载,一、C+中的运算符 1、大多数系统预定义运算符都能重载,除开以下: . : ?: # *(当乘法运算符时可重载) “.” “:” “*”在C+中有特定定义 “?:”不值得重载 “#”不能被重载 2、重载时的注意事项: (1)不能改变优先级; (2)不能改变结合性; (3)不能改变运算符所需操作数的个数; (4)重载后,可按这些运算符的表达方式使用。,一、通过运算符重载函数进行重载 1、运算

5、符重载函数是成员函数 语法形式: Type X:operator(参数表) /相对于该类而定义的操作 ,运算符重载的语法形式,返回类型,重载该运算符的类名,要重载的运算符符号,2、运算符重载函数是友元函数 语法形式: Type operator(参数表) /相对于该类而定义的操作 ,罗列运算符所需要的操作数,3、实例,void operator+( ) void operator-( ) void counter:operator+( ) if (value65535) value+; , void counter:operator-( ) if (value0) value-; ,注意:重载

6、中注意的问题 1、运算符重载函数是友元函数、成员函数的区别; 2、运算符被重载时,只是相对一特定类被重载,在特定的环境下作出特定的解释。当离开这个特定环境后,具有原来的意义(系统定义); 3、当重载运算符解释失败时,用该运算符的预定义版本(系统)进行解释; 4、用此方法重载时,只能对一个系统已有运算符进行特定环境下的新的解释,而不能创造新的运算符。当运算符不够用时,用函数调用来实现; 5、除“=”以外,重载的运算符可以被任何派生类所继承,“=”需要每个类明确定义自己的解释; 6、 重载可能让程序的可读性下降,在使用时应模仿运算符的习惯用法 。,一、运算符重载函数定义的两种方式 1、成员函数和友

7、元函数 2、差别的关键原因:this指针 二、一元运算符 1、不论前缀还是后缀,需要一个操作数 2、对于任意一元运算符: (1)成员函数重载运算符 定义 type x:operator ( ) 显式调用 objX.operator ( ) 隐式调用 objX 或:ojbX (2)友元函数重载运算符 定义 type operator (Xobj) 显式调用 operator(obj X) 隐式调用 ojbX 或:objX ,一元和二元运算符,一元运算符的重载,三、二元运算符 1、需要两个操作数; 2、对于任意二元运算符:,用成员函数重载运算符,例7-6 1、重载“+”、“=”、“+”;读懂几个成

8、员函数; 2、成员函数重载运算符,激活运算符的对象都是由THIS指针隐含传递的。,用友元函数重载运算符,1、成员函数重载可能造成的麻烦:成员函数重载的运算符不具有交换性。 原因:成员函数仅能被一个“实际对象”所调用,如果引起成员函数调用的是一个值(非一个对象),成员函数将不能正确工作。 2、可用友元函数解决这一问题: 友元函数重载运算符时,需要明确给出参数,不会出错。 3、不能用友元函数重载的运算符: = 、 ( )、- 4、注意: (1)对THIS所指向的数据的任何改变都会影响到激活运算数函数的对象。 (2)可使用引用参数(指针)来解决重载时的二义性。,重载+和-,一、关于+和- - 1、C

9、中的+和- -的两种形式: 前缀:+i; 后缀:i-; 2、在C+中的约定 (显式地区分前缀和后缀) (1)对于前缀方式+i: 成员函数:XX:operator + (); 友元函数:X operator + (X 第二个参数INT一般设置为0,如: i+ 等价于:i+(0) 或:i+=0,二、实例 Class X X operator +() a+; b+; return *this; X operator +(int x) X temp; a+; b+; return temp; ,Class X friend operator +(Y ,重载赋值运算符,一、概述 1、“”赋值运算符可以被

10、重载; 2、重载后不能被继承; 3、必须重载为成员函数。 二、格式: X X : operator=(const X from) /复制X的成员; 三、一般来说当缺省的类赋值函数不能正确工作时,考虑“”的重载。,7.2 模板,模板包含函数模板与类模板 7.2.1 函数模板 1函数模板的定义 函数模板的定义为: template (形参表) /函数定义体 ,由class或typename后加一个标识符构成,【例】函数模板的说明,template Glorp min( Glorp a, Glorp b ) return a b ? a : b; 注意:对函数模板的说明和定义必须是全局作用域,函数模

11、板不能说明为类的成员函数,2函数模板的实例化,在函数模板中,函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行。当编译系统发现一个函数调用时,将根据实参表中的类型生成一个重载函数即模板函数。,【例】函数模板的实例化,#include template A fab(A x) return x=0?x,-x; void main() int i=5; double y=-5.4; cout”整数的绝对值”fab(i)endl; /A实例化为int cout”实数的绝对值”fab(y)endl; / A实例化为double ,7.2.2 类模板,1类模板的定义 template clas

12、s /类说明体 template :(形参表) /成员函数定义体 template :(形参表) /成员函数定义体 。 template :(形参表) /成员函数定义体 ,【例】设计一套完整的算术运算来补充add函数。,template class CCalculator public: CCalculator(const T ,2类模板的实例化,类模板不能直接使用,必须实例化为相应的模板类 创建类模板的实例的一般格式为: ; 上例类模板CCalculator的实例化为: CCalculator calc(5, 2); / 创建一个整数计算对象 const int z = calc.mult(); / 结果应该为 10,

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

当前位置:首页 > 高等教育 > 大学课件

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