第10章运算符重载课件.ppt

上传人:小飞机 文档编号:2108314 上传时间:2023-01-11 格式:PPT 页数:69 大小:200.29KB
返回 下载 相关 举报
第10章运算符重载课件.ppt_第1页
第1页 / 共69页
第10章运算符重载课件.ppt_第2页
第2页 / 共69页
第10章运算符重载课件.ppt_第3页
第3页 / 共69页
第10章运算符重载课件.ppt_第4页
第4页 / 共69页
第10章运算符重载课件.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《第10章运算符重载课件.ppt》由会员分享,可在线阅读,更多相关《第10章运算符重载课件.ppt(69页珍藏版)》请在三一办公上搜索。

1、第10章 运算符重载,10.1 什么是运算符重载10.2 运算符重载的方法10.3 重载运算符的规则10.4 运算符重载函数作为类成员函数和友元函数10.5 重载双目运算符10.6 重载单目运算符10.7 重载流插入运算符和流提取运算符10.8 不同类型数据间的转换,第10章 运算符重载10.1 什么是运算符重载,函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。用户能根据自己的需要对C+已提供的运算符进行重载,赋予它们新的含义,使之一名多用。例如10.1:用“+”号进行两个复数的相加。在C+中不能在程序中直接用运算符“+”对复数进行相加运算。用户必须自己设法实现复数相加。,10.1

2、什么是运算符重载,函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。1,例10.1 通过函数来实现复数相加。#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,例10.1 通过函数来实现复数相加。,c.imag=imag+c2.imag;return c;void Complexdisplay()/定义输出函数c

3、out(real,imagi)endl;int main()Complex c1(3,4),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;,c.imag=imag+c2.imag;能否直接用加号“+”,运算符重载的方法

4、是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。重载运算符的函数一般格式如下:函数类型 operator 运算符名称(形参表列)对运算符的重载处理 例如,想将“+”用于Complex类(复数)的加法运算,函数的原型可以是这样的:Complex operator+(Complex,10.2 运算符重载的方法,运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载,在定义了重载运算符的函数后,可以说:函数operator+重载了运算符+。为了说明在运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想像为调用下面的函数:int op

5、erator+(int a,int b)return(a+b);如果有表达式5+8,就调用此函数,将5和8作为调用函数时的实参,函数的返回值为13。这就是用函数的方法理解运算符。,在定义了重载运算符的函数后,可以说:函数,例10.2 改写例10.1,重载运算符“+”,使之能用于两个复数相加。#include using namespace std;class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex,operator+取代了 com

6、plex_add,隐含this指针,例10.2 改写例10.1,重载运算符“+”,使之能用于两个,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=;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

7、.operator+(c2),return c;c3=plex_add(c2,运算符重载函数operator+还可以改写得更简练一些:Complex Complexoperator+(Complex 需要说明的是:运算符被重载后,其原有的功能仍然保留,没有丧失或改变。通过运算符重载,扩大了C+已有运算符的作用范围,使之能用于类对象。运算符重载使C+具有更强大的功能、更好的可扩充性和适应性,这是C+最吸引人的特点之一。,运算符重载函数operator+还可以改写得更简练一些:,(1)C+不允许用户自己定义新的运算符,只能对已有的C+运算符进行重载。(2)C+允许重载的运算符见书中表10.1。C+

8、中不能重载的运算符只有5个:.(成员访问运算符).*(成员指针访问运算符)(域运算符)sizeof(长度运算符)?:(条件运算符),10.3 重载运算符的规则,(1)C+不允许用户自己定义新的运算符,只能对已有的C+,(3)重载不能改变运算符运算对象(即操作数)的个数(4)重载不能改变运算符的优先级别。(5)重载不能改变运算符的结合性。(6)重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数。(7)重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C+的标准类型,以防止用户修改用于标准类型数据的运算符的性质,

9、(3)重载不能改变运算符运算对象(即操作数)的个数,(8)用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。地址运算符&也不必重载,它能返回类对象在内存中的起始地址。(9)应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。(10)运算符重载函数可以是类的成员函数、类的友元函数和普通函数。,(8)用于类对象的运算符一般必须重载,但有两个例外,运算符,成员函数重载:上例中c1+c2c1.operator+(c2)即通过对象c1调用运算符重载成员函数,以表达式中第二个参数(运算符

10、右侧的类对象c2)作为函数实参。重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this-real+c2.real,this-real就是c1.real。,10.4 运算符重载函数作为类成员函数和友元函数,成员函数重载:上例中10.4 运算符重载函数作为类成员函数和,例10.3 将运算符“+”重载为适用于复数加法,重载函数不作为成员函数,而放在类外,作为Complex类的友元函数。#include using namespace std;class Complexpublic:Complex()real=0;imag=0;Com

11、plex(double r,double i)real=r;imag=i;friend Complex operator+(Complex,例10.3 将运算符“+”重载为适用于复数加法,重载函数不作,Complex operator+(Complex,operator+(c1,c2),Complex operator+(Complex&c,何种情况下选择运算符重载函数为类的成员函数、类的友元函数和普通函数:普通函数不能直接访问类的私有成员,极少选用。如果将运算符重载函数作为成员函数,它可以通过this指针自由地访问本类的数据成员,可以少写一个函数的参数。但必须要求运算表达式第一个参数(即运算

12、符左侧的操作数)是一个类对象。左侧的操作数是标准类型就要使用友元函数(访问私有成员),何种情况下选择运算符重载函数为类的成员函数、类的友元函数和普,例如:将一个复数和一个整数相加,如c1+i,可以将运算符重载函数作为成员函数,如下面的形式:Complex Complexoperator+(int/运算符“+”的左侧不是类对象,编译出错,例如:将一个复数和一个整数相加,如c1+i,可以将运算符重载,如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式i+c2,运算符左侧的操作数i是整数),这时是无法利用前面定义的重载运算符的,因为无法调用i.operator+函数。可想而

13、知,如果运算符左侧的操作数属于C+标准类型(如int)或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在Complex类中声明:,如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是,friend Complex operator+(int/正确,类型匹配c3=c2+i;/错误,类型不匹配,friend Complex operator+(int&,注意:数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运算符“+”。如Complex operator+(Complex C+规定,有的运算符(

14、如赋值运算符、下标运算符、函数调用运算符)必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“”、类型转换运算符)。,注意:数学上的交换律在此不适用。如果希望适用交换律,则应再重,由于友元的使用会破坏类的封装,因此从原则上说,一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。说明:有的C+编译系统(如Visual C+6.0)没有完全实现C+标准,它所提供不带后缀.h的头文件不支持把成员函数重载为友元函数。但是Visual C+所提供的老形式的带后缀.h的头文件可以支持此项功能,因此可以将程序头两行修改如下,即可顺利运行:#include 以后如遇到类似情况,亦可照

15、此办理。,由于友元的使用会破坏类的封装,因此从原则上说,一般将单目运算,双目运算符(或称二元运算符)是C+中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧。例10.4 定义一个字符串类String,用来存放不定长的字符串,重载运算符“=”,“”,用于两个字符串的等于、小于和大于的比较运算。,10.5 重载双目运算符,双目运算符(或称二元运算符)是C+中最常用的运算符。双目运,编程过程:(1)先建立一个String类:#include using namespace std;class Stringpublic:String()p=NULL;/默认构造函数String(char*

16、str);/构造函数void display();private:char*p;/字符型指针,用于指向字符串;,编程过程:,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,StringString(char*str),(2)现在增加对运算符“”重载的部

17、分。程序如下:#include#include using namespace std;class Stringpublic:String()p=NULL;String(char*str);friend bool operator(String,(2)现在增加对运算符“”重载的部分。程序如下:,void Stringdisplay()/输出p所指向的字符串cout(String,程序运行结果为1。其他两个运算符的重载如法炮制即可。,void Stringdisplay()/输出p,(3)扩展到对3个运算符重载。在String类体中声明3个成员函数:friend bool operator(St

18、ring,(3)扩展到对3个运算符重载。,bool operator=(String,运行结果为:100,bool operator=(String&string,(4)再进一步修饰完善,下面给出最后的程序。#include using namespace std;class Stringpublic:String()p=NULL;String(char*str);friend bool operator(String,(4)再进一步修饰完善,下面给出最后的程序。,StringString(char*str)p=str;void Stringdisplay()/输出p所指向的字符串cout(S

19、tring bool operator(String&string1,String&string2),StringString(char*str),if(strcmp(string1.p,string2.p)(string1,string2)=1)string1.display();cout;string2.display();elseif(operator(string1,string2)=1),if(strcmp(string1.p,string2.p,string1.display();cout;string2.display();else if(operator=(string1,st

20、ring2)=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;,运行结果为HelloBookBookComputerHello=Hello,string1.display();cout;,增加了一个compare函数

21、,用来对两个字符串进行比较,并输出相应的信息。这样可以减轻主函数的负担,使主函数简明易读。编写C+程序的指导思想是:先搭框架,逐步扩充,由简到繁,最后完善。边编程,边调试,边扩充。千万不要企图在一开始时就解决所有的细节。类是可扩充的,可以一步一步地扩充它的功能。最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一步再做下一步,步步为营。这样编程和调试的效率是比较高的。,增加了一个compare函数,用来对两个字符串进行比较,并输,单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的+i和-i等。单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作

22、为成员函数,则还可省略此参数。下面以自增运算符“+”为例,介绍单目运算符的重载。,10.6 重载单目运算符,单目运算符只有一个操作数,如!a,-b,&c,*p,,例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+();/声明运算符重载函

23、数void display()coutminute:secendl;private:int minute;int sec;,例10.5 有一个Time类,包含数据成员minute(分),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行),Time

24、 Timeoperator+()/定义运算,“+”和“-”运算符有两种使用方式:前置自增运算符:后置自增运算符:C+约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。例10.6 在上例基础上增加对后置自增运算符的重载。修改后的程序如下:#include using namespace std;class Timepublic:Time()minute=0;sec=0;Time(int m,int s):minute(m),sec(s),“+”和“-”运算符有两种使用方式:,Time operator+();/声明前置自增运算符“+”重载函数Time o

25、perator+(int);/声明后置自增运算符“+”重载函数void display()cout=60)sec-=60;+minute;return*this;/返回自加后的当前对象 Time Timeoperator+(int)/后置自增运算符“+”重载函数Time temp(*this);/保存当前对象值sec+;,Time operator+();/声明前置自增运算,if(sec=60)sec-=60;+minute;return temp;/返回的是自加前的对象int main()Time time1(34,59),time2;cout time1:;time1.display();

26、+time1;cout+time1:;time1.display();time2=time1+;/将自加前的对象的值赋给time2couttime1+:;time1.display();cout time2:;time2.display();/输出time2对象的值,if(sec=60)sec-=60;+minute;,运行结果如下:time1:34:59(time1原值)+time1:35:0(执行+time1后time1的值)time1+:35:1(再执行time1+后time1的值)time2:35:0(time2保存的是执行time1+前time1的值)可以看到:重载后置自增运算符时,

27、多了一个int型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用。编译系统在遇到重载后置自增运算符时,会自动调用此函数。,运行结果如下:,10.7 重载流插入运算符和流提取运算符,istream 类的对象cin;Ostream 类的对象cout;流插入运算符“”凡是用“cout”对标准类型数据进行输入输出的,都要用#include 把头文件包含到本程序文件中。,10.7 重载流插入运算符和流提取运算符istream 类的,如果想直接用“”输出和输入自己声明的类型的数据,必须对它们重载。对“”重载的函数形式如下:istream 重载运算符“”的函数的第一个参数和函数

28、的类型都必须是istream&类型,第二个参数是要进行输入操作的类。重载“”和“”的函数作为友元函数或普通的函数,而不能将它们定义为成员函数。,如果想直接用“”输出和输入自己声明的类型的数据,例10.7 在例10.2的基础上,用重载“using namespace std;class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex/运算符“”重载为友元函数private:,10.7.1 重载流插入运算符“”,例10.7 在例10.2的基础

29、上,用重载“”输出复数。,double real;double imag;Complex Complexoperator+(Complex,coutc3解释为:operator(cout,c3),double real;double imag;cout,运行结果为:(8+14i)连续向输出流插入信息coutc3c2;先处理coutc3,即:(coutc3)c2;而执行(coutc3)得到的结果就是具有新内容的流对象cout,因此,(coutc3)c2相当于cout(新值)c2。运算符“”左侧是ostream类对象cout,右侧是Complex类对象c2,则再次调用运算符“”重载函数,接着向输出

30、流插入c2的数据。现在可以理解了为什么C+规定运算符“”重载函数的第一个参数和函数的类型都必须是ostream类型的引用,就是为了返回cout的当前值以便连续输出。,运行结果为:(8+14i),请读者注意区分什么情况下的“”是标准类型数据的流插入符,什么情况下的“”是重载的流插入符。如:coutc35endl;有下划线的是调用重载的流插入符,后面两个“”不是重载的流插入符,因为它的右侧不是Complex类对象而是标准类型的数据,是用预定义的流插入符处理的。,请读者注意区分什么情况下的“”是标准类型数据的流插入符,,还有一点要说明:在本程序中,在Complex类中定义了运算符“”重载函数为友元函

31、数,因此只有在输出Complex类对象时才能使用重载的运算符,对其他类型的对象是无效的。如couttime1;/time1是Time类对象,不能使用用于Complex类的重载运算符,还有一点要说明:在本程序中,在Complex类中定义了运算,C+预定义的运算符“”的作用是从一个输入流中提取数据,如“cini;”表示从输入流中提取一个整数赋给变量i(假设已定义i为int型)。重载流提取运算符的目的是希望将“”用于输入自定义类型的对象的信息。,10.7.2 重载流提取运算符“”,C+预定义的运算符“”的作用是从一个输入流中提取数据,,例10.8 在例10.7的基础上,增加重载流提取运算符“”,用“

32、cin”输入复数,用“coutusing namespace std;class Complexpublic:friend ostreamistream&operator(istream&input,Complex&c),例10.8 在例10.7的基础上,增加重载流提取运算符“,coutc.realc.imag;return input;int main()Complex c1,c2;cinc1c2;coutc1=c1endl;coutc2=c2endl;return 0;运行情况如下:input real part and imaginary part of complex number:3

33、 6input real part and imaginary part of complex number:4 10c1=(3+6i)c2=(4+10i),coutinput real part and im,虚部如果是负数,就不理想,请观察输出结果。input real part and imaginary part of complex number:3 6input real part and imaginary part of complex number:4-10c1=(3+6i)c2=(4+-10i)将重载运算符“=0)output+”;/虚部为正数时,在前加“+”号output

34、c.imagi)endl;/虚部为负数时,不加“+”号return output;这样,运行时输出的最后一行为c2=(4-10i)。,虚部如果是负数,就不理想,请观察输出结果。,运算符重载中使用引用(reference)的重要性:利用引用作为函数的形参可以在调用函数的过程中通过传址方式使形参成为实参的别名,因此不生成临时变量(实参的副本),减少了时间和空间的开销如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在赋值号的左侧而成为左值(left value),可以被赋值或参与其他操作(如保留cout流的当前值以便能连续使用“”输出)。使用引用时要特别小心,因为

35、修改了引用就等于修改了它所代表的对象。,运算符重载中使用引用(reference)的重要性:,隐式类型转换 显式类型转换在C+中,某些不同类型数据之间可以自动转换,例如:int i=6;i=7.5+i;int double double这种转换是由C+编译系统自动完成的,用户不需干预。这种转换称为隐式类型转换。,10.8 不同类型数据间的转换 10.8.1 标准类型数据间的转换,隐式类型转换10.8 不同类型数据间的转换 10.8.1,C+还提供显式类型转换,程序人员在程序中指定将一种指定的数据转换成另一指定的类型,其形式为 类型名(数据)如:int(89.5);其作用是将89.5转换为整型数

36、89。对于用户自己声明的类型,编译系统并不知道怎样进行转换。解决这个问题的关键是让编译系统知道怎样去进行这些转换,需要定义专门的函数来处理,C+还提供显式类型转换,程序人员在程序中指定将一种指定的数,转换构造函数(conversion constructor function)的作用是将一个其他类型的数据转换成一个类的对象。先回顾一下以前学习过的几种构造函数:默认构造函数。以Complex类为例,函数原型的形式为:Complex();/没有参数用于初始化的构造函数。函数原型的形式为:Complex(double r,double i);/形参表列中一般有两个以上参数用于复制对象的复制构造函数。

37、函数原型的形式为:,10.8.2 转换构造函数,转换构造函数(conversion constructor,Complex(Complex 其作用是将double型的参数r转换成Complex类的对象,将r作为复数的实部,虚部为0。用户可以根据需要定义转换构造函数,在函数体中告诉编译系统怎样去进行转换。在类体中,可以有转换构造函数,也可以没有转换构造函数,视需要而定。以上几种构造函数可以同时出现在同一个类中,它们是构造函数的重载。编译系统会根据建立对象时给出的实参的个数与类型选择形参与之匹配的构造函数。,Complex(Complex/,使用转换构造函数将一个指定的数据转换为类对象的方法如下:

38、先声明一个类。在这个类中定义一个只有一个参数的构造函数,参数的类型是需要转换的类型,在函数体中指定转换的方法。在该类的作用域内可以用以下形式进行类型转换:类名(指定类型的数据)就可以将指定类型的数据转换为此类的对象。,使用转换构造函数将一个指定的数据转换为类对象的方法如下:,不仅可以将一个标准类型数据转换成类对象,也可以将另一个类的对象转换成转换构造函数所在的类对象。如可以将一个学生类对象转换为教师类对象,可以在Teacher类中写出下面的转换构造函数:Teacher(Student注意:对象s中的num,name,sex必须是公用成员,否则不能被类外引用。,不仅可以将一个标准类型数据转换成类

39、对象,也可以将另一个类的对,用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。C+提供类型转换函数(type conversion function)来解决这个问题。类型转换函数的作用是将一个类的对象转换成另一类型的数据。如果已声明了一个Complex类,可以在Complex类中这样定义类型转换函数:operator double()return real;,10.8.3 类型转换函数,用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不,类型转换函数的一般形式为:op

40、erator 类型名()实现转换的语句在函数名前面不能指定函数类型,函数没有参数。其返回值的类型是由函数名中指定的类型名来确定的。类型转换函数只能作为成员函数,因为转换的主体是本类的对象。不能作为友元函数或普通函数。,类型转换函数的一般形式为:,转换构造函数和类型转换运算符有一个共同的功能:当需要的时候,编译系统会自动调用这些函数,建立一个无名的临时对象(或临时变量)。,转换构造函数和类型转换运算符有一个共同的功能:当需要的时候,例10.9 使用类型转换函数的简单例子。#include using namespace std;class Complexpublic:Complex()real=

41、0;imag=0;Complex(double r,double i)real=r;imag=i;operator double()return real;/类型转换函数private:double real;double imag;,int main()Complex c1(3,4),c2(5,-10),c3;double d;d=2.5+c1;/要求将一个double数据与Complex类数据相加coutdendl;return 0;,例10.9 使用类型转换函数的简单例子。int main(,分析:(1)如果在Complex类中没有定义类型转换函数operator double,程序编译

42、将出错。(2)如果在main函数中加一个语句:c3=c2;由于赋值号两侧都是同一类的数据,是可以合法进行赋值的,没有必要把c2转换为double型数据。(3)如果在Complex类中声明了重载运算符“+”函数作为友元函数:Complex operator+(Complex c1,Complex c2)/定义运算符“+”重载函数return Complex(c1.real+c2.real,c1.imag+c2.imag);若在main函数中有语句,分析:,c3=c1+c2;由于已对运算符“+”重载,使之能用于两个Complex类对象的相加,因此将c1和c2按Complex类对象处理,相加后赋值给

43、同类对象c3。如果改为d=c1+c2;/d为double型变量将c1与c2两个类对象相加,得到一个临时的Complex类对象,由于它不能赋值给double型变量,而又有对double的重载函数,于是调用此函数,把临时类对象转换为double数据,然后赋给d。从前面的介绍可知:对类型的重载和本章开头所介绍的对运算符的重载的概念和方法都是相似的。重载函数都使用关键字operator。,c3=c1+c2;,因此,通常把类型转换函数也称为类型转换运算符函数,由于它也是重载函数,因此也称为类型转换运算符重载函数(或称强制类型转换运算符重载函数)。假如程序中需要对一个Complex类对象和一个double

44、型变量进行+,-,*,/等算术运算,以及关系运算和逻辑运算,如果不用类型转换函数,就要对多种运算符进行重载,以便能进行各种运算。这样,是十分麻烦的,工作量较大,程序显得冗长。如果用类型转换函数对double进行重载(使Complex类对象转换为double型数据),就不必对各种运算符进行重载,因为Complex类对象可以被自动地转换为double型数据,而标准类型的数据的运算,是可以使用系统提供的各种运算符的。,因此,通常把类型转换函数也称为类型转换运算符函数,由于它也是,例10.10 包含转换构造函数、运算符重载函数和类型转换函数的程序。#include using namespace st

45、d;class Complexpublic:Complex()real=0;imag=0;/默认构造函数Complex(double r)real=r;imag=0;/转换构造函数Complex(double r,double i)real=r;imag=i;friend Complex operator+(Complex c1,Complex c2);void display();private:double real;double imag;,例10.10 包含转换构造函数、运算符重载函数和类型转换函数,Complex operator+(Complex c1,Complex c2)/定义

46、运算符“+”重载函数return Complex(c1.real+c2.real,c1.imag+c2.imag);void Complexdisplay()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+2.5;/复数与double数据相加c3.display();return 0;,operator+(c1,2.5)相当于:operator+(c1,Complex(2.5),Complex operator+(Complex c1,对程序的分析:(1)如果没有定义转换构造函数,则此程序编译出错。(2)在处理

47、表达式c1+2.5时,编译系统把它解释为:operator+(c1,2.5)由于2.5不是Complex类对象,系统先调用转换构造函数Complex(2.5),建立一个临时的Complex类对象,其值为(2.5+0i)。上面的函数调用相当于:operator+(c1,Complex(2.5)将c1与(2.5+0i)相加,赋给c3。运行结果为:(5.5+4i)(3)如果把“c3=c1+2.5;”改为c3=2.5+c1;程序可以通过编译和正常运行。过程与前相同。重要结论:在已定义了相应的转换构造函数情况下,将运算符“+”函数重载为友元函数,在进行两个复数相加时,可以用交换律。,对程序的分析:,作业:1.在做完课后第2题的基础上进行适当改动或添加函数,实现第3题2.课后第6题,作业:,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号