第8章操作符重载课件.ppt

上传人(卖家):晟晟文业 文档编号:4622427 上传时间:2022-12-26 格式:PPT 页数:28 大小:124KB
下载 相关 举报
第8章操作符重载课件.ppt_第1页
第1页 / 共28页
第8章操作符重载课件.ppt_第2页
第2页 / 共28页
第8章操作符重载课件.ppt_第3页
第3页 / 共28页
第8章操作符重载课件.ppt_第4页
第4页 / 共28页
第8章操作符重载课件.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、第第8章章 操作符重载操作符重载 8.1 操作符重载概述操作符重载概述 8.2操作符重载为类的成员函数操作符重载为类的成员函数 8.3操作符重载为友员函数操作符重载为友员函数8.4 增量增量/减量减量操作符的重载操作符的重载8.5 下标操作符的重载下标操作符的重载 8.6 函数调用操作符的函数调用操作符的重载重载 8.7 类成员访问操作符的重载类成员访问操作符的重载 重载是重载是C+C+多态性的体现之一。多态性的体现之一。C+语言允许程序员重新定义已有的语言允许程序员重新定义已有的操作操作符,使其能按用户的要求完成一些特定的操作,符,使其能按用户的要求完成一些特定的操作,这就是所谓的这就是所谓

2、的操作操作符重载。符重载。操作操作符重载与函数符重载与函数重载相似,其目的是设置某一重载相似,其目的是设置某一操作操作符,让它具符,让它具有另一种功能,尽管此有另一种功能,尽管此操作操作符在原先符在原先C+语言语言中代表另一种含义,但他们彼此之间并不冲突。中代表另一种含义,但他们彼此之间并不冲突。C+会根据会根据操作操作符的位置辨别应使用哪一种功符的位置辨别应使用哪一种功能进行能进行操作操作。8.1操作符重载概述操作符重载概述1.1.重载的意义重载的意义赋予操作符新的含义,使它能象完成标准类型的数赋予操作符新的含义,使它能象完成标准类型的数据操作一样来完成对类对象的操作。据操作一样来完成对类对

3、象的操作。2 2重载规则重载规则 (1)(1)只能重载只能重载C+C+语言中原先已有定义的语言中原先已有定义的操作操作符。符。(2)(2)不能重载下列四个不能重载下列四个操作操作符:符:.,.*,:,?:?:(3)(3)不能改变不能改变操作操作符的操作数个数。符的操作数个数。(4)(4)不能改变不能改变操作操作符原有的优先级。符原有的优先级。(5)(5)不能改变不能改变操作操作符原有的结合特性。符原有的结合特性。(6)(6)不能改变不能改变操作操作符对预定义类型数据的操作方式。符对预定义类型数据的操作方式。3 3重载形式有两种:重载形式有两种:成员函数成员函数形式和形式和友元函数友元函数形式。

4、形式。8.2 8.2 操作符重载为类的成员函数操作符重载为类的成员函数 假设需要针对类假设需要针对类X X重载操作符重载操作符“”(代表任何一个被重载的代表任何一个被重载的操作符操作符),则在定义类,则在定义类X X时时,可用如下形式来实现该操作符重载:可用如下形式来实现该操作符重载:class Xclass X public public:ReturnType operator(ReturnType operator(参数表参数表);;其中:其中:ReturnTypeReturnType为操作符函数的返回值类型,即操作结果的类型;为操作符函数的返回值类型,即操作结果的类型;operatoro

5、perator为操作符重载时必须使用的关键字,它和被重载的操为操作符重载时必须使用的关键字,它和被重载的操作符连在一起,作为操作符函数的专用函数名,作符连在一起,作为操作符函数的专用函数名,务必把该函数说务必把该函数说明为公有的明为公有的;是被重载的操作符;是被重载的操作符;参数表中列出该运算符所需要的操作数,如下所述:参数表中列出该运算符所需要的操作数,如下所述:(1)(1)重载一元重载一元(单目单目)操作符时,参数表为空。在这种操作符时,参数表为空。在这种情况下,当前对象情况下,当前对象(即,调用该操作符函数的对象即,调用该操作符函数的对象)作为作为该操作符唯一的操作数。该操作符唯一的操作

6、数。(2)(2)重载二元重载二元(双目双目)操作符时,参数表中有一个参数。操作符时,参数表中有一个参数。在这种情况下,当前对象作为该操作符的左操作数,参在这种情况下,当前对象作为该操作符的左操作数,参数作为右操作数。数作为右操作数。不难看出,当使用成员函数重载运算符时,定义操作符函不难看出,当使用成员函数重载运算符时,定义操作符函数的方法与定义普通成员函数的方法基本相同,唯一差数的方法与定义普通成员函数的方法基本相同,唯一差别是,操作符函数的名字必须为别是,操作符函数的名字必须为operator(operator(为任何一为任何一个被重载的运算符个被重载的运算符),而不能由程序员随意为运算符函

7、,而不能由程序员随意为运算符函数起名字。数起名字。例:复数类中以例:复数类中以成员函数成员函数形式重载操作符形式重载操作符#includeclass Complex public:Complex(int r=0,int i=0);void display();Complex operator+(Complex&c);protected:int real;int imag;Complex:Complex(int r,int i)real=r;imag=i;void Complex:display()coutreal0?+:)imagiendl;Complex Complex:operator+(

8、Complex&c)return Complex(real+c.real,imag+c.imag);void main()Complex c1(35,56);c1.display();Complex c2(-12,-78),c3;c2.display();c3=c1+c2;c3.display();8.3操作符重载为友员函数操作符重载为友员函数 假设需要针对类假设需要针对类X X重载操作符重载操作符“”(代表任何一个被重代表任何一个被重载的运算符载的运算符),则在定义类,则在定义类X X时时,可用如下形式来实现该操作可用如下形式来实现该操作符重载,使它成为类符重载,使它成为类X X的友元函数:

9、的友元函数:class Xclass X friend ReturnType operator(friend ReturnType operator(参数表参数表)该格式与前面说明运算符函数使之成为类该格式与前面说明运算符函数使之成为类X X的成员函数的格式的成员函数的格式相比,主要有以下几点差别:相比,主要有以下几点差别:(1)(1)在函数原型前多了一个关键字在函数原型前多了一个关键字friendfriend。(2)(2)由于是友元函数,因此在类由于是友元函数,因此在类X X的公有段和私有段说明此函数的公有段和私有段说明此函数的效果相同;而若作为成员函数说明运算符函数,则必须的效果相同;而若

10、作为成员函数说明运算符函数,则必须放在类放在类X X的公有段,否则无法公开使用被重载的运算符。的公有段,否则无法公开使用被重载的运算符。(3)(3)由于这样说明的由于这样说明的操作操作符函数是类符函数是类X X的友元函数而的友元函数而不是成员函数,因此它没有不是成员函数,因此它没有thisthis指针。由此可以指针。由此可以推知,必须在参数表中显式列出每一个操作数。推知,必须在参数表中显式列出每一个操作数。因此,用友元函数重载运算符时参数表中参数个因此,用友元函数重载运算符时参数表中参数个数,比用成员函数重载运算符时参数表中的参数数,比用成员函数重载运算符时参数表中的参数个数多一个。也就是说,

11、重载一元个数多一个。也就是说,重载一元操作操作符时参数符时参数表中应该有一个参数;重载二元表中应该有一个参数;重载二元操作操作符时参数表符时参数表中应该有两个参数,其中第一个参数作为左操作中应该有两个参数,其中第一个参数作为左操作数,第二个参数作为右操作数。数,第二个参数作为右操作数。用友元函数重载之后,用友元函数重载之后,操作符的语义:操作符的语义:(1)(1)一元操作符的语义。一元操作符的语义。如果在类如果在类X X中重载了一元运算符中重载了一元运算符,xobjxobj为为X X类的一个对类的一个对象,则象,则xobjxobj或或xobjxobj的语义为:的语义为:operator(xob

12、j)operator(xobj)(2)(2)二元运算符的语义。二元运算符的语义。如果在类如果在类X X中重载了二元运算符中重载了二元运算符,xobj1xobj1和和xobj2xobj2是是X X类类的 两 个 对 象,则的 两 个 对 象,则 x o b j 1 x o b j 2x o b j 1 x o b j 2 的 语 义 为:的 语 义 为:operator(xobj1,xobj2)operator(xobj1,xobj2)总之,使用重载后的运算符操作类的对象时,虽然可以总之,使用重载后的运算符操作类的对象时,虽然可以像操作预定义类型数据时一样,也采用人们习惯的形像操作预定义类型数据

13、时一样,也采用人们习惯的形式,但是它的实际含义却是调用相应的运算符函数。式,但是它的实际含义却是调用相应的运算符函数。例:复数类中以例:复数类中以友元函数友元函数形式重载操作符形式重载操作符#includeclass Complex public:Complex(int r=0,int i=0);void display();friend Complex operator+(Complex&a,Complex&b);protected:int real;int imag;Complex:Complex(int r,int i)real=r;imag=i;void Complex:display

14、()coutreal0?+:)imagiendl;Complex operator+(Complex&a,Complex&b)return Complex(a.real+b.real,a.imag+b.imag);void main()Complex c1(35,56);c1.display();Complex c2(-12,-78),c3;c2.display();c3=c1+c2;c3.display();8.4 8.4 增量增量/减量操作符的重载减量操作符的重载 在进行增量操作符在进行增量操作符+和减量操作符和减量操作符-的重载的重载时,要注意时,要注意+和和-有前缀式与后缀式之分。有前

15、缀式与后缀式之分。1.1.当前缀当前缀+和前缀和前缀-重载为类的成员函数时,重载为类的成员函数时,+obj+obj和和-obj-obj编译器理解的形式为:编译器理解的形式为:obj.operator+()obj.operator+()和和obj.operator-()obj.operator-()函数原型为:函数原型为:T operator+()T operator+();和和 T operator-()T operator-();其中,其中,T T为返回类型。为返回类型。2.2.当前缀当前缀+和前缀和前缀-重载为类的友员函数时,重载为类的友员函数时,+obj+obj和和-obj-obj编译器

16、理解的形式为:编译器理解的形式为:operator+(obj)operator+(obj)和和 operator-(obj)operator-(obj)函数原型为:函数原型为:friend T operator+(U obj)friend T operator+(U obj);和和 friend T operator-(U obj)friend T operator-(U obj);其中,其中,T T为返回类型,为返回类型,U U为操作数为操作数objobj的数据类型。函数的数据类型。函数定义时不要用定义时不要用friendfriend关键字。关键字。同理,当后缀同理,当后缀+和后缀和后缀-重

17、载为类的成员函数时,重载为类的成员函数时,obj+obj+和和obj-obj-编译器理解的形式为:编译器理解的形式为:obj.operator+(0)obj.operator+(0)和和 obj.operator-(0)obj.operator-(0)函数原型为:函数原型为:T operator+(int)T operator+(int);和和T operator-(int)T operator-(int);其中,其中,T T为返回类型。为返回类型。并且,当后缀并且,当后缀+和后缀和后缀-重载为类的友员函数时,重载为类的友员函数时,obj+obj+和和obj-obj-编译器理解的形式为:编译器

18、理解的形式为:operator+(obj,0)operator+(obj,0)和和operator-(obj,0)operator-(obj,0)函数原型为:函数原型为:friend T operator+(U obj,int)friend T operator+(U obj,int);和和friend T operator-(U obj,int)friend T operator-(U obj,int);其中,其中,T T为返回类型,为返回类型,U U为操作数为操作数objobj的数据类型。函数定义时不要的数据类型。函数定义时不要用用friendfriend关键字。关键字。例:的复数类中以例

19、:的复数类中以成员函数成员函数形式重载操作符形式重载操作符.#includeclass Complex public:Complex(int r=0,int i=0);void display();Complex&operator+();Complex operator+(int);protected:int real;int imag;Complex:Complex(int r,int i)real=r;imag=i;void Complex:display()coutreal0?+:)imagiendl;Complex&Complex:operator+()real+;imag+;retu

20、rn*this;Complex Complex:operator+(int)Complex temp=*this;real+;imag+;return temp;void main()Complex c1(34,56);c1.display();Complex c2=c1+;c2.display();c1.display();Complex c3=+c1;c3.display();c1.display();#include#include/#includeclass Time private:int hour,minute,second;public:Time(int h,int m,int

21、s);Time operator+();void disptime();Time:Time(int h,int m,int s)hour=h;minute=m;second=s;Time Time:operator+()second+;if(second=60)minute+;second=0;if(minute=60)hour+;minute=0;if(hour=24)hour=0;return*this;void Time:disptime()couthour:minute :secondendl;void main()long stop=0;Time t(23,59,55);do +t;

22、stop+;for(long i=0;i90000000;i+);t.disptime();while(stop100);例:在时间类中的应用例:在时间类中的应用8.5 8.5 下标操作符的重载下标操作符的重载 下标操作符下标操作符是一个是一个双目操作符双目操作符。它的左操作数是数组名,。它的左操作数是数组名,右操作数是下标。右操作数是下标。下标操作符下标操作符只能被重载为类的只能被重载为类的非静态成员函数非静态成员函数。因此只能。因此只能为下标操作符显式声明一个形参,该形参为下标操作符的右操为下标操作符显式声明一个形参,该形参为下标操作符的右操作数,左操作数则由作数,左操作数则由thisth

23、is指针提供。指针提供。设在类设在类T T中重载下标操作符,则下标操作符重载声明的一般形中重载下标操作符,则下标操作符重载声明的一般形式为:式为:T1 operator(U);T1 operator(U);其中,其中,T1T1是返回值的数据类型,是返回值的数据类型,U U是形参的数据类型,是形参的数据类型,operatoroperator是函数调用符。是函数调用符。下标操作符重载定义的一般形式为:下标操作符重载定义的一般形式为:T1 T:operator(U)T1 T:operator(U)/函数体函数体 对下标操作符进行了重载声明和定义之后,就可对下标操作符进行了重载声明和定义之后,就可以采

24、用下面的形式来调用它。以采用下面的形式来调用它。ab ab 或或 a.operator(b)a.operator(b)其中,其中,a a是左操作数,相当于数组名。此处所谓的相是左操作数,相当于数组名。此处所谓的相当是指:数组名是一个常量,而此处的当是指:数组名是一个常量,而此处的a a却不一定是却不一定是常量;但是常量;但是a a又可以象数组名一样使用。又可以象数组名一样使用。b b是下标,它是下标,它可以是任意类型。如整型、字符型、甚至是某个类类可以是任意类型。如整型、字符型、甚至是某个类类型。型。#include iostream.h#include stdlib.hclass array

25、 public:array(int size);array();double&operator(int i);private:double*a;int up_bound;array:array(int size)up_bound=size;a=new doublesize;array:array()delete a;double&array:operator(int i)if(i=up_bound)coutsubscript verflow!endl;exit(1);return ai;void main(void)array b(10);b0=12.34;b3=b2=b1=b0;b8=567

26、.89;coutb0 b3 b8endl;b10=256.78;8.6 8.6 函数调用操作符的重载函数调用操作符的重载 重载的函数调用操作符是类的一个非静态成员函数,它是一重载的函数调用操作符是类的一个非静态成员函数,它是一个双目操作符,左操作数由个双目操作符,左操作数由thisthis指针提供,右操作数是形参表,指针提供,右操作数是形参表,形参表中可以有一个或多个参数,也可以是空。设在类形参表中可以有一个或多个参数,也可以是空。设在类T T中重中重载函数调用操作符,则函数调用操作符重载声明的一般形式为:载函数调用操作符,则函数调用操作符重载声明的一般形式为:T1 operator()(T1

27、 operator()(形参表形参表););其中,其中,T1T1是函数调用操作符函数返回值的数据类型。是函数调用操作符函数返回值的数据类型。函数调用操作符重载定义的一般形式为:函数调用操作符重载定义的一般形式为:T1 T:operator()(T1 T:operator()(形参表形参表)/函数体函数体 对函数调用操作符进行了重载声明和定义之后,就可以采用下面对函数调用操作符进行了重载声明和定义之后,就可以采用下面的形式来调用它。的形式来调用它。a.(a.(实参表实参表)或或 a.operator()(a.operator()(实参表实参表)例例8.7 8.7 重载函数调用操作符实现计算三角形

28、面积的抽象。重载函数调用操作符实现计算三角形面积的抽象。#include iostream.h#include iostream.h#include math.h#include math.hclass FUNclass FUN public:public:double operator()(double a,double b,double c);double operator()(double a,double b,double c);double FUN:operator()(double a,double b,double c)double FUN:operator()(double a

29、,double b,double c)double s=(a+b+c)/2.0;double s=(a+b+c)/2.0;return sqrt(s return sqrt(s*(s-a)(s-a)*(s-b)(s-b)*(s-c);(s-c);void main(void)void main(void)FUN f;FUN f;coutf(30,40,50)endl;coutf(30,40,50)endl;coutf.operator()(300,400,500)endl;coutf.operator()(300,400,500)”-”又被称为又被称为递引用运算符、指针间接运算符、成员指针运算

30、符。类成员访问递引用运算符、指针间接运算符、成员指针运算符。类成员访问指针操作符指针操作符-作为单目后缀操作符,它只能被重载为类的非静态作为单目后缀操作符,它只能被重载为类的非静态成员函数,并且不能带有形参,它的左操作数由成员函数,并且不能带有形参,它的左操作数由thisthis指针提供。指针提供。“-”-”的重载可以实现一种的重载可以实现一种“委托委托”或或“转送转送”技术,对委托指技术,对委托指针进行赋值就可以在运行时实现对象重构。针进行赋值就可以在运行时实现对象重构。类类T T中重载类成员访问指针操作符,则类成员访问指针操作符重载中重载类成员访问指针操作符,则类成员访问指针操作符重载声明

31、的一般形式为:声明的一般形式为:T1T1*operator-();operator-();其中,其中,T1T1*表示函数调用操作符函数返回的表示函数调用操作符函数返回的T1T1类型的指针。类型的指针。类成员访问指针操作符重载定义的一般形式为:类成员访问指针操作符重载定义的一般形式为:T1T1*T:operator-()T:operator-()/函数体函数体 对类成员访问指针操作符进行了重载声明和定义之后,就可以对类成员访问指针操作符进行了重载声明和定义之后,就可以采用下面的形式来调用它。采用下面的形式来调用它。obj-func();obj-func();或或 (obj.operator-()

32、-func();(obj.operator-()-func();其中,其中,objobj是是T T类型的对象类型的对象,而而funcfunc是是T1T1类中的公有成员函数。即:类中的公有成员函数。即:T T类的对象类的对象objobj代替代替T1T1类的对象对类的对象对T1T1类的公有成员函数进行了类的公有成员函数进行了操作。操作。例例8.8 8.8 通过类成员访问指针操作符重载实现将通过类成员访问指针操作符重载实现将DateDate类的对象的类的对象的操作交由另一个操作交由另一个P_DateP_Date类的对象代为操作。类的对象代为操作。#include iostream.h#include

33、 iostream.hclass Dateclass Date public:public:Date(int m=0,int d=0,int y=0)Date(int m=0,int d=0,int y=0)month=m;day=d;year=y;month=m;day=d;year=y;void show()void show()coutmonth/day/yearendl;coutmonth/day/year()operator-()static Date Date0(0,0,0);static Date Date0(0,0,0);if(pri=NULL)if(pri=NULL)return&Date0;return&Date0;return pri;return pri;Date Date*pub;pub;private:private:Date Date*pri;pri;void main(void)void main(void)P_Date d1;P_Date d1;d1-show();d1-show();Date d2(1,26,2004);Date d2(1,26,2004);d1=&d2;d1=&d2;(d1.operator-()-show();(d1.operator-()-show();d1.pub-show();d1.pub-show();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第8章操作符重载课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|