《运算符重载 》PPT课件.ppt
《《运算符重载 》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《运算符重载 》PPT课件.ppt(69页珍藏版)》请在三一办公上搜索。
1、第10章 运算符重载,10.1 什么是运算符重载10.2 运算符重载的方法10.3 重载运算符的规则10.4 运算符重载函数作为类成员函数和友元函数10.5 重载双目运算符10.6 重载单目运算符10.7 重载流插入运算符和流提取运算符10.8 不同类型数据间的转换,函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。用户能根据自己的需要对C+已提供的运算符进行重载,赋予它们新的含义,使之一名多用。例如10.1:用“+”号进行两个复数的相加。在C+中不能在程序中直接用运算符“+”对复数进行相加运算。用户必须自己设法实现复数相加。,10.1 什么是运算符重载,例10.1 通过函数来实现复数
2、相加。#include using namespace std;class Complex/定义Complex类public:Complex()real=0;imag=0;/定义构造函数Complex(double r,double i)real=r;imag=i;/构造函数重载Complex complex_add(Complex,c.imag=imag+c2.imag;return c;void Complexdisplay()/定义输出函数cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;/定义3个复数对象c3=ple
3、x_add(c2);/调用复数相加函数coutc1=;c1.display();/输出c1的值coutc2=;c2.display();/输出c2的值coutc1+c2=;c3.display();/输出c3的值return 0;运行结果如下:c1=(3,4i)c2=(5,-10i)c1+c2=(8,-6i),能否直接用加号“+”来实现复数运算呢?如:c3=c1+c2;,运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。重载运算符的函数一般格式如下:函数类型 operator 运算符名称(形参表列)对运算符的重载处理 例如,想将“+
4、”用于Complex类(复数)的加法运算,函数的原型可以是这样的:Complex operator+(Complex,10.2 运算符重载的方法,在定义了重载运算符的函数后,可以说:函数operator+重载了运算符+。为了说明在运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想像为调用下面的函数:int operator+(int a,int b)return(a+b);如果有表达式5+8,就调用此函数,将5和8作为调用函数时的实参,函数的返回值为13。这就是用函数的方法理解运算符。,例10.2 改写例10.1,重载运算符“+”,使之能用于两个复数相加。#include us
5、ing namespace std;class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex,operator+取代了 complex_add,隐含this指针,return c;void Complexdisplay()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;/运算符+用于复数运算coutc1=;c1.display();coutc2=;
6、c2.display();coutc1+c2=;c3.display();return 0;运行结果:c1=(3,4i)c2=(5,-10i)c1+c2=(8,-6i),c3=plex_add(c2);c1+c2解释为:c1.operator+(c2),运算符重载函数operator+还可以改写得更简练一些:Complex Complexoperator+(Complex 需要说明的是:运算符被重载后,其原有的功能仍然保留,没有丧失或改变。通过运算符重载,扩大了C+已有运算符的作用范围,使之能用于类对象。运算符重载使C+具有更强大的功能、更好的可扩充性和适应性,这是C+最吸引人的特点之一。,(
7、1)C+不允许用户自己定义新的运算符,只能对已有的C+运算符进行重载。(2)C+允许重载的运算符见书中表10.1。C+中不能重载的运算符只有5个:.(成员访问运算符).*(成员指针访问运算符)(域运算符)sizeof(长度运算符)?:(条件运算符),10.3 重载运算符的规则,(3)重载不能改变运算符运算对象(即操作数)的个数(4)重载不能改变运算符的优先级别。(5)重载不能改变运算符的结合性。(6)重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数。(7)重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C
8、+的标准类型,以防止用户修改用于标准类型数据的运算符的性质,(8)用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。地址运算符&也不必重载,它能返回类对象在内存中的起始地址。(9)应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。(10)运算符重载函数可以是类的成员函数、类的友元函数和普通函数。,成员函数重载:上例中c1+c2c1.operator+(c2)即通过对象c1调用运算符重载成员函数,以表达式中第二个参数(运算符右侧的类对象c2)作为函数实参。重载函数operat
9、or+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this-real+c2.real,this-real就是c1.real。,10.4 运算符重载函数作为类成员函数和友元函数,例10.3 将运算符“+”重载为适用于复数加法,重载函数不作为成员函数,而放在类外,作为Complex类的友元函数。#include using namespace std;class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;friend Complex opera
10、tor+(Complex,Complex operator+(Complex,何种情况下选择运算符重载函数为类的成员函数、类的友元函数和普通函数:普通函数不能直接访问类的私有成员,极少选用。如果将运算符重载函数作为成员函数,它可以通过this指针自由地访问本类的数据成员,可以少写一个函数的参数。但必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象。左侧的操作数是标准类型就要使用友元函数(访问私有成员),例如:将一个复数和一个整数相加,如c1+i,可以将运算符重载函数作为成员函数,如下面的形式:Complex Complexoperator+(int/运算符“+”的左侧不是类对象,
11、编译出错,如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式i+c2,运算符左侧的操作数i是整数),这时是无法利用前面定义的重载运算符的,因为无法调用i.operator+函数。可想而知,如果运算符左侧的操作数属于C+标准类型(如int)或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在Complex类中声明:,friend Complex operator+(int/正确,类型匹配c3=c2+i;/错误,类型不匹配,注意:数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运
12、算符“+”。如Complex operator+(Complex C+规定,有的运算符(如赋值运算符、下标运算符、函数调用运算符)必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“”、类型转换运算符)。,由于友元的使用会破坏类的封装,因此从原则上说,一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。说明:有的C+编译系统(如Visual C+6.0)没有完全实现C+标准,它所提供不带后缀.h的头文件不支持把成员函数重载为友元函数。但是Visual C+所提供的老形式的带后缀.h的头文件可以支持此项功能,因此可以将程序头两行修改如下,即可顺利运行:#include
13、以后如遇到类似情况,亦可照此办理。,双目运算符(或称二元运算符)是C+中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧。例10.4 定义一个字符串类String,用来存放不定长的字符串,重载运算符“=”,“”,用于两个字符串的等于、小于和大于的比较运算。,10.5 重载双目运算符,编程过程:(1)先建立一个String类:#include using namespace std;class Stringpublic:String()p=NULL;/默认构造函数String(char*str);/构造函数void display();private:char*p;/字符型指针,用
14、于指向字符串;,StringString(char*str)/定义构造函数p=str;/使p指向实参字符串void Stringdisplay()/输出p所指向的字符串coutp;int main()String string1(Hello),string2(Book);string1.display();coutendl;string2.display();return 0;运行结果为:HelloBook,(2)现在增加对运算符“”重载的部分。程序如下:#include#include using namespace std;class Stringpublic:String()p=NULL
15、;String(char*str);friend bool operator(String,void Stringdisplay()/输出p所指向的字符串cout(String,程序运行结果为1。其他两个运算符的重载如法炮制即可。,(3)扩展到对3个运算符重载。在String类体中声明3个成员函数:friend bool operator(String,bool operator=(String,运行结果为:100,(4)再进一步修饰完善,下面给出最后的程序。#include using namespace std;class Stringpublic:String()p=NULL;Strin
16、g(char*str);friend bool operator(String,StringString(char*str)p=str;void Stringdisplay()/输出p所指向的字符串cout(String bool operator(String&string1,String&string2),if(strcmp(string1.p,string2.p)(string1,string2)=1)string1.display();cout;string2.display();elseif(operator(string1,string2)=1),string1.display()
17、;cout;string2.display();else if(operator=(string1,string2)=1)string1.display();cout=;string2.display();coutendl;int main()String string1(Hello),string2(Book),string3(Computer),string4(Hello);compare(string1,string2);compare(string2,string3);compare(string1,string4);return 0;,运行结果为HelloBookBookComput
18、erHello=Hello,增加了一个compare函数,用来对两个字符串进行比较,并输出相应的信息。这样可以减轻主函数的负担,使主函数简明易读。编写C+程序的指导思想是:先搭框架,逐步扩充,由简到繁,最后完善。边编程,边调试,边扩充。千万不要企图在一开始时就解决所有的细节。类是可扩充的,可以一步一步地扩充它的功能。最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一步再做下一步,步步为营。这样编程和调试的效率是比较高的。,单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的+i和-i等。单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员
19、函数,则还可省略此参数。下面以自增运算符“+”为例,介绍单目运算符的重载。,10.6 重载单目运算符,例10.5 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。#include using namespace std;class Timepublic:Time()minute=0;sec=0;/默认构造函数Time(int m,int s):minute(m),sec(s)/构造函数重载Time operator+();/声明运算符重载函数void display()coutminute:sece
20、ndl;private:int minute;int sec;,Time Timeoperator+()/定义运算符重载函数if(+sec=60)sec-=60;/满60秒进1分钟+minute;return*this;/返回当前对象值 int main()Time time1(34,0);for(int i=0;i61;i+)+time1;time1.display();return 0;,运行情况如下:34:134:234:5935:035:1(共输出61行),“+”和“-”运算符有两种使用方式:前置自增运算符:后置自增运算符:C+约定:在自增(自减)运算符重载函数中,增加一个int型形参
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算符重载 运算符重载 PPT课件 运算 重载 PPT 课件
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5611059.html