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