数据结构-运算符重载.ppt
《数据结构-运算符重载.ppt》由会员分享,可在线阅读,更多相关《数据结构-运算符重载.ppt(75页珍藏版)》请在三一办公上搜索。
1、第10章 运算符重载,10.1 什么是运算符重载10.2 运算符重载的方法10.3 重载运算符的规则10.4 运算符重载函数作为类成员函数和友元函数10.5 重载双目运算符10.6 重载单目运算符10.7 重载流插入运算符和流提取运算符10.8 不同类型数据间的转换,10.1 什么是运算符重载,C+中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义的类型,也需要类似的运算。这时就必须重新定义这些运算符,赋于已有运算符新的功能,使之能够用于特定类型执行特定操作。,实际上,很多C+操作符已经被重载。例如,将*操作符用于地址,将得到在这个地址中的值;但将它用于两个数字时,得到
2、的将是它们的乘积。C+根据操作数的数目和类型来决定采用哪种操作。,使同一个运算符作用于不同类型的数据时导致不同的行为的这种机制称为运算符重载。C+通过重载运算符使之用于自定义类型,扩展了运算符的功能,这也是C+最具吸引力的优点之一。,运算符重载机制,运算符重载是通过重载一种特殊函数运算符函数来实现的。对C+运算符可作如下理解:编译器在对运算符进行编译处理时,将一个运算符编译成如下形式:一元运算符:obj operator(obj)二元运算符:obj1obj2 operator(obj1,obj2)由于C+中有前增(减)、后增(减),为了区分它们,C+将后增(减)编译成:后增:obj+opera
3、tor+(obj,0)后减:obj-operator-(obj,0),依照上述规则,8+9、10.5+3.5分别编译成运算符函数调用形式为:operator+(8,9);operator+(10.5,3.5);C+为+运算符提供了多种运算符函数,其原型有:operator+(int,int);operator+(double,double);等,10.2 运算符重载的方法,运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。,重载运算符的函数一般格式如下:函数类型
4、 operator 运算符名称(形参表列)对运算符的重载处理,#include using namespace std;class Complex double real;double imag;public:Complex()real=0;imag=0;Complex(double r,double i):real(r),imag(i)friend Complex operator+(Complex,Complex operator+(Complex,int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();co
5、utc2=;c2.display();coutc1+c2=;c3.display();return 0;,10.3 重载运算符的规则,C+不允许用户自己定义新的运算符,只能对已有的C+运算符进行重载。C+允许重载的运算符 C+中绝大部分的运算符允许重载。具体规定见书中表10.1。不能重载的运算符只有5个:.(成员访问运算符).*(成员指针访问运算符)(域运算符)sizeof(长度运算符)?:(条件运算符)前两个运算符不能重载是为了保证访问成员的功能不能被改变,域运算符和sizeof运算符的运算对象是类型而不是变量或一般表达式,不具重载的特征。,重载不能改变运算符运算对象(即操作数)的个数。重载
6、不能改变运算符的优先级别。重载不能改变运算符的结合性。重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(3)点矛盾。,重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C+的标准类型,以防止用户修改用于标准类型数据的运算符的性质。,用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。地址运算符&也不必重载,它能返回类对象在内存中的起始地址。应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实
7、现的功能。,运算符重载并不能自动实现,必须编写运算符重载函数才能实现。有时这此函数最好作为成员函数出现;有时它们最好是友元函数;偶尔它们可以作为全局、非友元函数出现。,10.4 运算符重载函数作为类成员函数和友元函数,在上节中采用友元的形式重载了复数+的运算符,其声明如下:friend Complex operator+(Complex 现将之改为成员函数的形式。,class Complexprivate:double real;double imag;public:Complex()real=0;imag=0;Complex(double r,double i):real(r),imag(i
8、)Complex operator+(Complex,Complex Complex:operator+(Complex,“+”是双目运算符,为什么程序中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,这个隐含的参数就是this指针。在重载运算符为成员函数时,其第一个参数隐含地为左操作数对象。Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;实际上执行的是c1.operator+(this,c2),下面这些Complex成员函数声明正确吗?Complex operator+(Complex
9、c1,Complex c2);Complex operator-(int a);如要能进行如下运算,重载的操作符可以定义为成员函数吗?2+a;/a为复数对象,如果左操作数必须是一个不同类的对象或者是一个基本类型对象,那么该运算符函数必须作为全局函数来实现。如果要重载()、-、=运算符,运算符重载函数必须为类的成员函数。,为什么?,10.5 重载双目运算符,双目运算符(或称二元运算符)是C+中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,如3+5,a=b,i10等。在重载双目运算符时,不言而喻在函数中应该有两个参数。下面再举一个例子说明重载双目运算符的应用。,例,定义一个字符串
10、类String,用来存放不定长的字符串,重载运算符“=”,“”,用于两个字符串的等于、小于和大于的比较运算。下面分几步来介绍编程过程。,先建立一个String类,#include using namespace std;class Stringpublic:String()p=NULL;/默认构造函数 String(char*str);/构造函数 void display();private:char*p;/字符型指针,用于指向字符串;,String:String(char*str)/定义构造函数 p=str;/使p指向实参字符串void String:display()/输出p所指向的字符串
11、 coutp;,int main()String string1(Hello),string2(Book);string1.display();coutendl;string2.display();return 0;,(2)增加对运算符重载的部分。先重载一个运算符“”。,#include#include using namespace std;class Stringpublic:String()p=NULL;/默认构造函数 String(char*str);/构造函数 void display();friend bool operator(String,String:String(char*
12、str)/定义构造函数 p=str;/使p指向实参字符串void String:display()/输出p所指向的字符串 cout(String,int main()String string1(Hello),string2(Book);coutstring2)endl;程序运行结果为1。其他两个运算符的重载如法炮制即可。,扩展到对3个运算符重载。,见教材P325通过这个例子,不仅可以学习到有关双目运算符重载的知识,而且还可以学习怎样去编写C+程序。这种方法的指导思想是:先搭框架,逐步扩充,由简到繁,最后完善。边编程,边调试,边扩充。千万不要企图在一开始时就解决所有的细节。类是可扩充的,可以一
13、步一步地扩充它的功能。最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一步再做下一步,步步为营。,10.6 重载单目运算符,单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的+i和-i等。重载单目运算符的方法与重载双目运算符的方法是类似的。但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数。单目运算符一般重载为成员函数。,例,有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。,#include using namespace std;class Timepubli
14、c:Time()minute=0;/默认构造函数 sec=0;Time(int m,int s):minute(m),sec(s)/构造函数重载 Time operator+();/声明运算符重载函数 void display()coutminute:secendl;/定义输出时间函数 private:int minute;int sec;,Time Time:operator+()/定义运算符重载函数 if(+sec=60)sec-=60;/满60秒进1分钟+minute;return*this;/返回当前对象值,int main()Time time1(34,0);for(int i=0;
15、i61;i+)+time1;time1.display();return 0;,“+”和“-”运算符有两种使用方式,前置自增运算符和后置自增运算符,它们的作用是不一样的,在重载时怎样区别这二者呢?针对“+”和“-”这一特点,C+约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。,例,在上例程序的基础上增加对后置自增运算符的重载。修改后的程序如下:,class Timepublic:Time()minute=0;/默认构造函数 sec=0;Time(int m,int s):minute(m),sec(s)/构造函数重载 Time operator+()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 运算 重载

链接地址:https://www.31ppt.com/p-4980251.html