第7章 重载及模板_第1页
第7章 重载及模板_第2页
第7章 重载及模板_第3页
第7章 重载及模板_第4页
第7章 重载及模板_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章重载与模板重载与模板 重载在C+中,允许两个或两个以上的函数采用相同的名字,只要使用不同类型、不同数目的参数或不同的返回值,编译器便知道在什么情况下该调用哪个函数,这就叫函数重载。如: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()f()

2、函数的函数的形参的个形参的个数及类型数及类型一一一一比较比较来判断来判断。()()作为重载函数至少在作为重载函数至少在参数个数参数个数、参数类型参数类型上有所不上有所不同。若仅在返回类型上不同,编译器是无法区别的。同。若仅在返回类型上不同,编译器是无法区别的。如:如:void func(int); int func(int); /void func(int); int func(int); /错误错误 int min(int ,int); int min(int ,int); int min(int,int,int); /int min(int,int,int); /正确正确 int add(

3、int,int); int add(int,int); double add(double,double); /double add(double,double); /正确正确()()typedeftypedef定义的类型只是给已有类型取另外一个名定义的类型只是给已有类型取另外一个名字,编译器不能将其同原类型区分。字,编译器不能将其同原类型区分。如:如: typedef INT int;typedef INT int; void func(int x) . void func(int x) . void func (INT x) void func (INT x) (3 3)重载函数一般应具有

4、相同的功能,否则会破坏程序重载函数一般应具有相同的功能,否则会破坏程序的可读性。的可读性。问题的提出问题的提出1、基本数据类型系统提供了大量运算符。、基本数据类型系统提供了大量运算符。如:如:int x,y; x=x+y; 表达简洁,使用方便。表达简洁,使用方便。2、问题的提出:、问题的提出: 对于串类的对象合并:对于串类的对象合并: string x, y; strcat(x,y);不如上述运算那样简单,希望能改不如上述运算那样简单,希望能改造为:造为:x=x+y;更加简单和直观更加简单和直观! 因此,需要对因此,需要对“+”进行不同的解释,即:重载进行不同的解释,即:重载7.1.2 运算符

5、重载运算符重载一、一、C+中的运算符中的运算符1、大多数系统预定义运算符都能重载,除开以下:、大多数系统预定义运算符都能重载,除开以下: . : ?: # *(当乘法运算符时可重载当乘法运算符时可重载) “.” “:” “*”在在C+中有特定定义中有特定定义 “?:”不值得重载不值得重载 “#”不能被重载不能被重载2、重载时的注意事项:、重载时的注意事项:(1)不能改变优先级;不能改变优先级;(2)不能改变结合性;不能改变结合性;(3)不能改变运算符所需操作数的个数;不能改变运算符所需操作数的个数;(4)重载后,可按这些运算符的表达方式使用。重载后,可按这些运算符的表达方式使用。 一、通过运算

6、符重载函数进行重载一、通过运算符重载函数进行重载1、运算符重载函数是成员函数、运算符重载函数是成员函数 语法形式:语法形式:Type X:operator(参数表参数表) /相对于该类而定义的操作相对于该类而定义的操作 运算符重载的语法形式运算符重载的语法形式返回类型返回类型重载该运算符的重载该运算符的类名类名要重载的运算符要重载的运算符符号符号2、运算符重载函数是友元函数、运算符重载函数是友元函数 语法形式:语法形式:Type operator(参数表参数表) /相对于该类而定义的操作相对于该类而定义的操作 罗列运算符所罗列运算符所需要的操作数需要的操作数3、实例、实例void operat

7、or+( ) void operator-( ) void counter:operator+( ) if (value0) value-;注意:重载中注意的问题注意:重载中注意的问题1、运算符重载函数是友元函数、成员函数的区别;、运算符重载函数是友元函数、成员函数的区别;2、运算符被重载时,只是相对一特定类被重载,在特定的环、运算符被重载时,只是相对一特定类被重载,在特定的环境下作出特定的解释。当离开这个特定环境后,具有原来的境下作出特定的解释。当离开这个特定环境后,具有原来的意义意义(系统定义系统定义);3、当重载运算符解释失败时,用该运算符的预定义版本、当重载运算符解释失败时,用该运算符

8、的预定义版本(系统系统)进行解释;进行解释;4、用此方法重载时,只能对一个系统已有运算符进行特定环、用此方法重载时,只能对一个系统已有运算符进行特定环境下的新的解释,而不能创造新的运算符。当运算符不够用境下的新的解释,而不能创造新的运算符。当运算符不够用时,用函数调用来实现;时,用函数调用来实现;5、除、除“=”以外,重载的运算符可以被任何派生类所继承,以外,重载的运算符可以被任何派生类所继承,“=”需要每个类明确定义自己的解释;需要每个类明确定义自己的解释;6、 重载可能让程序的可读性下降,在使用时应模仿运算符的重载可能让程序的可读性下降,在使用时应模仿运算符的习惯用法习惯用法 。一、运算符

9、重载函数定义的两种方式一、运算符重载函数定义的两种方式1、成员函数和友元函数、成员函数和友元函数2、差别的关键原因:、差别的关键原因:this指针指针二、一元运算符二、一元运算符1、不论前缀还是后缀,需要一个操作数、不论前缀还是后缀,需要一个操作数2、对于任意一元运算符、对于任意一元运算符:(1)(1)成员函数重载运算符成员函数重载运算符 定义定义 type x:operator ( ) type x:operator ( ) 显式调用显式调用 objX.operator ( ) objX.operator ( ) 隐式调用隐式调用 objX objX 或:或:ojbXojbX(2)(2)友元

10、函数重载运算符友元函数重载运算符 定义定义 type operator (Xobj) type operator (Xobj) 显式调用显式调用 operator(obj X) operator(obj X) 隐式调用隐式调用 ojbX ojbX 或:或:objX objX 一元和二元运算符一元和二元运算符方式 定义显式调用隐式调用备注成员函数Type X:operator ( )( ) objX.operator ()() objX或:objX 操作数通过THIS指针隐含传递,因此参数表为空。友元函数Type operator ( X ojb)( X ojb) operator(objX)(

11、objX)objX或:objX ()()所需要的一个操作数在参数表中,由对象显式地提供。一元运算符的重载一元运算符的重载三、二元运算符三、二元运算符1、需要两个操作数;、需要两个操作数;2、对于任意二元运算符、对于任意二元运算符:方式 定义显式调用隐式调用备注成员函数Type X:operator (X obj)(X obj) objX1.operator (objX2)(objX2)objX1 (objX2)第一个操作数通过THIS指针隐含传递,第二个操作数通过参数提供,只有一个参数。友元函数Type operator ( X ojb)( X ojb) operator (objX1, (o

12、bjX1, objX2)objX2)objX1 (objX2)所需要的两个操作数在参数表中,由对象显式地提供。用成员函数重载运算符用成员函数重载运算符例例7-61、重载、重载“+”、“=”、“+”;读懂几个成员函数;读懂几个成员函数;2、成员函数重载运算符,激活运算符的对象都是由、成员函数重载运算符,激活运算符的对象都是由THIS指针隐含传递的。指针隐含传递的。用友元函数重载运算符用友元函数重载运算符1、成员函数重载可能造成的麻烦:成员函数重载的运算符不具有交换性。、成员函数重载可能造成的麻烦:成员函数重载的运算符不具有交换性。 原因:成员函数仅能被一个原因:成员函数仅能被一个“实际对象实际对

13、象”所调用,如果引起成员函数所调用,如果引起成员函数调用的是一个值调用的是一个值(非一个对象非一个对象),成员函数将不能正确工作。,成员函数将不能正确工作。2、可用友元函数解决这一问题:、可用友元函数解决这一问题:友元函数重载运算符时,需要明确给出参数,不会出错。友元函数重载运算符时,需要明确给出参数,不会出错。3、不能用友元函数重载的运算符:、不能用友元函数重载的运算符: = 、 ( )、- 4 4、注意:、注意:(1)(1)对对THISTHIS所指向的数据的任何改变都会影响到激活运算数函数的对象。所指向的数据的任何改变都会影响到激活运算数函数的对象。(2)(2)可使用引用参数可使用引用参数

14、( (指针指针) )来解决重载时的二义性。来解决重载时的二义性。重载重载+和和-一、关于一、关于+和和- - 1、C中的中的+和和- -的两种形式:的两种形式:前缀:前缀:+i; 后缀:后缀:i-;2、在、在C+中的约定中的约定 (显式地区分前缀和后缀显式地区分前缀和后缀)(1)对于前缀方式对于前缀方式+i: 成员函数:成员函数:XX:operator + (); 友元函数:友元函数:X operator + (X&);(2)(2)对于后缀方式对于后缀方式i+:i+: 成员函数:成员函数:XX:operator + (int); 友元函数:友元函数:X operator +(X&

15、;, int); 第二个参数第二个参数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 &a) a.x+; b.y+; return a; friend operator +(Y &a, int i) Y temp=a; a.x+; b.y+; return temp;重载赋值运算符

16、重载赋值运算符一、概述一、概述1、“”赋值运算符可以被重载;赋值运算符可以被重载;2、重载后不能被继承;、重载后不能被继承;3、必须重载为成员函数。、必须重载为成员函数。二、格式:二、格式:X X : operator=(const X from) /复制复制X的成员;的成员;三、一般来说当缺省的类赋值函数不能正确工作时,三、一般来说当缺省的类赋值函数不能正确工作时,考虑考虑“”的重载。的重载。模板7.2.1 函数模板 v 1函数模板的定义函数模板的定义为: template (形参表) /函数定义体 由class或typename后加一个标识符构成 【例7.13】函数模板的说明templat

17、e Glorp min( Glorp a, Glorp b ) return a b ? a : b; 注意:对函数模板的说明和定义必须是全局作用域,函数模板不能说明为类的成员函数 2函数模板的实例化v在函数模板中,函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行。当编译系统发现一个函数调用时,将根据实参表中的类型生成一个重载函数即模板函数。 【例7.14】函数模板的实例化#include template A fab(A x) return x=0?x,-x;void main() int i=5; double y=-5.4;cout”整数的绝对值”fab(i)endl;co

18、ut”实数的绝对值”fab(y)endl;7.2.2 类模板 v1类模板的定义类模板的定义 template vclass /类说明体类说明体 vtemplate :(形参表形参表) /成员函数定义体成员函数定义体 vtemplate :(形参表形参表) /成员函数定义体成员函数定义体 v。vtemplate :(形参表形参表) /成员函数定义体成员函数定义体 【例7.15】设计一套完整的算术运算来补充add函数。templateclass CCalculator public: CCalculator(const T &x, const T &y) : m_x(x), m_y(y) CCalculator(void) const T add(void) return m_x + m_y; const T sub(void)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论