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

上传人:石*** 文档编号:72167654 上传时间:2023-02-09 格式:PPT 页数:69 大小:2.59MB
返回 下载 相关 举报
第10章运算符重载优秀课件.ppt_第1页
第1页 / 共69页
第10章运算符重载优秀课件.ppt_第2页
第2页 / 共69页
点击查看更多>>
资源描述

《第10章运算符重载优秀课件.ppt》由会员分享,可在线阅读,更多相关《第10章运算符重载优秀课件.ppt(69页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第10章运算符重载第1页,本讲稿共69页函数重载就是对一个已有的函数赋予新的含义,使之函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。实现新功能。用户能根据自己的需要对用户能根据自己的需要对C+C+已提供的运算符进行已提供的运算符进行重载重载,赋予它们新的含义,使之赋予它们新的含义,使之一名多用一名多用。例如例如10.1 10.1:用:用“+”号进行两个复数的相加。在号进行两个复数的相加。在C+C+中不中不能在程序中直接用运算符能在程序中直接用运算符“+”对复数进行相加运算。用户对复数进行相加运算。用户必须自己设法实现复数相加。必须自己设法实现复数相加。10.1 10.1 什么是运算

2、符重载什么是运算符重载第2页,本讲稿共69页例例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&c2);/声明复数相加函数声明复数相加函数void display();/声明输出函数声明输出函数 private:double r

3、eal;/实部实部double imag;/虚部虚部;Complex Complex complex_add(Complex&c2)Complex c;c.real=real+c2.real;第3页,本讲稿共69页c.imag=imag+c2.imag;return c;void Complex display()/定义输出函数定义输出函数cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;/定义定义3个复数对象个复数对象c3=plex_add(c2);/调用复数相加函数调用复数相加函数coutc1=;c1.display()

4、;/输出输出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页,本讲稿共69页运算符重载的方法是定义一个重载运算符的函数,在需要执运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应行被重载的运算符时,系统就自动调用该函数,以实现相应的运算

5、。重载运算符的函数一般格式如下:的运算。重载运算符的函数一般格式如下:函数类型函数类型 operator operator 运算符名称运算符名称 (形参表列形参表列)对运算符的重载处理对运算符的重载处理 例如,想将例如,想将“+”用于用于ComplexComplex类类(复数复数)的加法运算,函数的的加法运算,函数的原型可以是这样的:原型可以是这样的:Complex operator+(Complex&c1,Complex&c2);Complex operator+(Complex&c1,Complex&c2);10.2 10.2 运算符重载的方法运算符重载的方法第5页,本讲稿共69页在定义了

6、重载运算符的函数后,可以说:在定义了重载运算符的函数后,可以说:函数函数operator+operator+重载了运算符重载了运算符+。为了说明在运算符重载后,。为了说明在运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相执行表达式就是调用函数的过程,可以把两个整数相加也想像为调用下面的函数:加也想像为调用下面的函数:int operator+(int a,int b)return(a+b);如果有表达式如果有表达式5+85+8,就调用此函数,将,就调用此函数,将5 5和和8 8作为调用函作为调用函数时的实参,函数的返回值为数时的实参,函数的返回值为1313。这就是用函数的方法。这就

7、是用函数的方法理解运算符。理解运算符。第6页,本讲稿共69页例例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&c2);/声明重载运算符的函数声明重载运算符的函数void display();private:double real;double imag;Co

8、mplex Complex operator+(Complex&c2)/定义重载运算符的函定义重载运算符的函数数 Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;operator+取代了取代了 complex_add隐含隐含this指针指针第7页,本讲稿共69页return c;void Complex display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;/运算符运算符+用于复数运算用于复数运算coutc1=;c1.display();co

9、utc2=;c2.display();coutreal+c2.realthis-real+c2.real,this-realthis-real就是就是c1.realc1.real。10.4 10.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数第13页,本讲稿共69页例例10.3 将运算符将运算符“+”重载为适用于复数加法,重载为适用于复数加法,重载函数重载函数不作为成员不作为成员函数,而放在类外,函数,而放在类外,作为作为Complex类的类的友元函数友元函数。#include using namespace std;class Complexpublic:C

10、omplex()real=0;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;第14页,本讲稿共69页Complex operator+(Complex&c1,Complex&c2)/定义友元函数定义友元函数的重载函数在类外访问私有成员的重载函数在类外访问私有成员return Complex(c1.real+c2.rea

11、l,c1.imag+c2.imag);void Complex display()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();operator+(c1,c2)第15页,本讲稿共69页何种情况下选择运算符重载函数为类的成员函数、类的友何种情况下选择运算符重载函数为类的成员函数、类的友元函数和普通函数:元函数和普通函数:普通函数不能直接访问类的私有成员,极少选用。普通函数不能

12、直接访问类的私有成员,极少选用。如果将运算符重载函数作为如果将运算符重载函数作为成员函数成员函数,它可以通过,它可以通过thisthis指指针自由地访问本类的数据成员,可以少写一个函数的参数。针自由地访问本类的数据成员,可以少写一个函数的参数。但必须要求运算表达式第一个参数但必须要求运算表达式第一个参数(即运算符左侧的操作数即运算符左侧的操作数)是一个是一个类对象。类对象。左侧的操作数是标准类型左侧的操作数是标准类型就要使用就要使用友元函数友元函数(访问私有成访问私有成员员)第16页,本讲稿共69页例如:将一个复数和一个整数相加,如例如:将一个复数和一个整数相加,如c1+ic1+i,可以将运算

13、符重,可以将运算符重载函数作为成员函数,如下面的形式:载函数作为成员函数,如下面的形式:Complex Complexoperator+(int&i)Complex Complexoperator+(int&i)return Complex(real+i,imag);return Complex(real+i,imag);注意注意在表达式中重载的运算符在表达式中重载的运算符“+”左侧应为左侧应为ComplexComplex类的对类的对象,如:象,如:c3=c2+i;c3=c2+i;不能写成不能写成c3=i+c2;c3=i+c2;/运算符运算符“+”的左侧不是类对象,编译出错的左侧不是类对象,编

14、译出错第17页,本讲稿共69页如果出于某种考虑,要求在使用重载运算符时运算符如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式左侧的操作数是整型量(如表达式i+c2i+c2,运算符左侧,运算符左侧的操作数的操作数i i是整数),这时是无法利用前面定义的重是整数),这时是无法利用前面定义的重载运算符的,因为无法调用载运算符的,因为无法调用i.operator+i.operator+函数。可想而函数。可想而知,如果运算符左侧的操作数属于知,如果运算符左侧的操作数属于C+C+标准类型标准类型(如如int)int)或是一个其他类的对象,则运算符重载函数不能作或是一个其他类的对

15、象,则运算符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问为成员函数,只能作为非成员函数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在类的私有成员,则必须声明为友元函数。可以在ComplexComplex类中声明:类中声明:第18页,本讲稿共69页friend Complex operator+(int&i,Complex&c);friend Complex operator+(int&i,Complex&c);/在类外定义友元函数:在类外定义友元函数:Complex operator+(int&i,Complex&c)return Complex operato

16、r+(int&i,Complex&c)return Complex(i+c.real,c.imag);Complex(i+c.real,c.imag);将双目运算符重载为友元函数时,将双目运算符重载为友元函数时,在函数的形参表在函数的形参表列中必须有两个参数,不能省略,形参的顺序任意,列中必须有两个参数,不能省略,形参的顺序任意,不要求第一个参数必须为类对象。但在使用运算符的不要求第一个参数必须为类对象。但在使用运算符的表达式中,要求运算符左侧的操作数与函数第一个参表达式中,要求运算符左侧的操作数与函数第一个参数对应,运算符右侧的操作数与函数的第二个参数对数对应,运算符右侧的操作数与函数的第二

17、个参数对应。如应。如c3=i+c2;c3=i+c2;/正确,类型匹配正确,类型匹配c3=c2+ic3=c2+i;/错误,类型不匹配错误,类型不匹配第19页,本讲稿共69页注意:注意:数学上的交换律在此不适用。如果希望适用交数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运算符换律,则应再重载一次运算符“+”。如。如Complex operator+(Complex&c,int&i)Complex operator+(Complex&c,int&i)/此时第一个参数为类对象此时第一个参数为类对象return Complex(i+c.real,c.imag);return Comple

18、x(i+c.real,c.imag);C+C+规定,有的运算符规定,有的运算符(如赋值运算符、下标运算符、函数如赋值运算符、下标运算符、函数调用运算符调用运算符)必须定义为类的成员函数,有的运算符则不能必须定义为类的成员函数,有的运算符则不能定义为类的成员函数定义为类的成员函数(如流插入如流插入“”、类型转换运算符、类型转换运算符)。第20页,本讲稿共69页由于友元的使用会破坏类的封装,因此从原则上说,由于友元的使用会破坏类的封装,因此从原则上说,一般一般将单目运算符重载为成员函数,将双目运算符重载为将单目运算符重载为成员函数,将双目运算符重载为友元函数。友元函数。说明:说明:有的有的C+C+

19、编译系统编译系统(如如Visual C+6.0)Visual C+6.0)没有完全没有完全实现实现C+C+标准,它所提供不带后缀标准,它所提供不带后缀.h.h的头文件不支持把的头文件不支持把成员函数重载为友元函数。但是成员函数重载为友元函数。但是Visual C+Visual C+所提供的老所提供的老形式的带后缀形式的带后缀.h.h的头文件可以支持此项功能,因此可的头文件可以支持此项功能,因此可以将程序头两行修改如下,即可顺利运行:以将程序头两行修改如下,即可顺利运行:#include#include 以后如遇到类似情况,亦可照此办理。以后如遇到类似情况,亦可照此办理。第21页,本讲稿共69页

20、双目运算符双目运算符(或称二元运算符或称二元运算符)是是C+C+中最常用的运算符。中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧。双目运算符有两个操作数,通常在运算符的左右两侧。例例10.4 10.4 定义一个字符串类定义一个字符串类StringString,用来存放不定长的字符,用来存放不定长的字符串,重载运算符串,重载运算符“=”,“”,用于两个字符串的,用于两个字符串的等于、小于和大于的比较运算。等于、小于和大于的比较运算。10.5 10.5 重载双目运算符重载双目运算符第22页,本讲稿共69页编程过程编程过程:(1)先建立一个先建立一个String类:类:#inclu

21、de using namespace std;class Stringpublic:String()p=NULL;/默认构造函数默认构造函数String(char*str);/构造函数构造函数void display();private:char*p;/字符型指针,用于指向字符串字符型指针,用于指向字符串;第23页,本讲稿共69页String String(char*str)/定义构造函数定义构造函数p=str;/使使p指向实参字符串指向实参字符串void String display()/输出输出p所指向的字符串所指向的字符串coutp;int main()String string1(He

22、llo),string2(Book);string1.display();cout”重载的部分。程序如下:重载的部分。程序如下:#include#include using namespace std;class Stringpublic:String()p=NULL;String(char*str);friend bool operator(String&string1,String&string2);/友元友元void display();private:char*p;/字符型指针,用于指向字符串字符型指针,用于指向字符串;String String(char*str)p=str;第25页

23、,本讲稿共69页void String display()/输出输出p所指向的字符串所指向的字符串cout(String&string1,String&string2)/定义运算定义运算符重载函数符重载函数if(strcmp(string1.p,string2.p)0)return true;else return false;int main()String string1(Hello),string2(Book);coutstring2)(String&string1,String&string2);friend bool operator(String&string1,String&st

24、ring2)if(strcmp(string1.p,string2.p)0)return true;else return false;bool operator(String&string1,String&string2)if(strcmp(string1.p,string2.p)0)return true;else return false;第27页,本讲稿共69页bool operator=(String&string1,String&string2)if(strcmp(string1.p,string2.p)=0)return true;elsereturn false;int mai

25、n()String string1(Hello),string2(Book),string3(Computer);coutstring2)endl;/比较结果应该为比较结果应该为truecout(string1string3)endl;/比较结果应该为比较结果应该为false cout(string1=string2)endl;/比较结果应该为比较结果应该为false return 0;运行结果为运行结果为:100第28页,本讲稿共69页(4)再进一步修饰完善,下面给出最后的程序。再进一步修饰完善,下面给出最后的程序。#include using namespace std;class Str

26、ingpublic:String()p=NULL;String(char*str);friend bool operator(String&string1,String&string2);friend bool operator(String&string1,String&string2);friend bool operator=(String&string1,String&string2);void display();private:char*p;第29页,本讲稿共69页String String(char*str)p=str;void String display()/输出输出p所指向

27、的字符串所指向的字符串cout(String&string1,String&string2)if(strcmp(string1.p,string2.p)0)return true;elsereturn false;bool operator(String&string1,String&string2)第30页,本讲稿共69页if(strcmp(string1.p,string2.p)(string1,string2)=1)string1.display();cout;string2.display();elseif(operator(string1,string2)=1)第31页,本讲稿共69

28、页string1.display();cout;string2.display();else if(operator=(string1,string2)=1)string1.display();cout=;string2.display();coutBookBookComputerHello=Hello第32页,本讲稿共69页增加了一个增加了一个comparecompare函数,用来对两个字符串进行比较,函数,用来对两个字符串进行比较,并输出相应的信息。这样可以减轻主函数的负担,使主函并输出相应的信息。这样可以减轻主函数的负担,使主函数简明易读。数简明易读。编写编写C+C+程序的指导思想是:程

29、序的指导思想是:先搭框架,逐步扩充,先搭框架,逐步扩充,由简到繁,最后完善。由简到繁,最后完善。边编程,边调试,边扩充。千边编程,边调试,边扩充。千万不要企图在一开始时就解决所有的细节。类是可扩万不要企图在一开始时就解决所有的细节。类是可扩充的,可以一步一步地扩充它的功能。充的,可以一步一步地扩充它的功能。最好直接在计算机上写程序,每一步都要上机调试,调试最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一步再做下一步,步步为营。这样编程和调试通过了前面一步再做下一步,步步为营。这样编程和调试的效率是比较高的。的效率是比较高的。第33页,本讲稿共69页 单目运算符只有一个操作数,如单

30、目运算符只有一个操作数,如!a!a,-b-b,&c&c,*p p,还有最常用的,还有最常用的+i+i和和-i-i等。等。单目运算符只有一个操作数,因此运算符重载函单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。则还可省略此参数。下面以自增运算符下面以自增运算符“+”为例,介绍单目运算符的重载。为例,介绍单目运算符的重载。10.6 10.6 重载单目运算符重载单目运算符第34页,本讲稿共69页例例10.5 10.5 有一个有一个TimeTime类,包含数据成员类,包含数据成员minute(

31、minute(分分)和和sec(sec(秒秒),模拟,模拟秒表,每次走一秒,满秒表,每次走一秒,满6060秒进一分钟,此时秒又从秒进一分钟,此时秒又从0 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:sec=60)

32、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:2 34:5935:035:1 (共输出共输出61行行)第36页,本讲稿共69页“+”和和“-”运算符有两种使用方式运算符有两种使用方式:前置自增运算符前置自增运算符:后置自增运算符后置自增运算符:C+:C+约定:约定:在自增在自增(自减自减)运算符重载函数中,运算符重载函数中,增加一

33、个增加一个intint型形参,就是后置自增型形参,就是后置自增(自减自减)运算符函数。运算符函数。例例10.6 10.6 在上例基础上增加对后置自增运算符的重载。修改后的程序在上例基础上增加对后置自增运算符的重载。修改后的程序如下:如下:#include using namespace std;class Timepublic:Time()minute=0;sec=0;Time(int m,int s):minute(m),sec(s)第37页,本讲稿共69页Time operator+();/声明前置自增运算符声明前置自增运算符“+”重载函数重载函数Time operator+(int);/

34、声明后置自增运算符声明后置自增运算符“+”重载函数重载函数void display()coutminute:sec=60)sec-=60;+minute;return*this;/返回自加后的当前对象返回自加后的当前对象 Time Time operator+(int)/后置自增运算符后置自增运算符“+”重载函数重载函数Time temp(*this);/保存当前对象值保存当前对象值sec+;第38页,本讲稿共69页if(sec=60)sec-=60;+minute;return temp;/返回的是自加前的对象返回的是自加前的对象int main()Time time1(34,59),tim

35、e2;cout time1:;time1.display();+time1;cout+time1:;time1.display();time2=time1+;/将自加前的对象的值赋给将自加前的对象的值赋给time2couttime1+:;time1.display();cout time2:;time2.display();/输出输出time2对象的值对象的值第39页,本讲稿共69页运行结果如下:运行结果如下:time1:34:59 time1:34:59 (time1原值原值)+time1:35:0 +time1:35:0 (执行执行+time1后后time1的值的值)time1+:35:1

36、 time1+:35:1(再执行再执行time1+后后time1的值的值)time2:35:0 time2:35:0 (time2保存的是执行保存的是执行time1+前前time1的值的值)可以看到:可以看到:重载后置自增运算符时,多了一个重载后置自增运算符时,多了一个intint型的参型的参数,增加这个参数只是为了与前置自增运算符重载函数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用。编译系统在遇到重数有所区别,此外没有任何作用。编译系统在遇到重载后置自增运算符时,会自动调用此函数。载后置自增运算符时,会自动调用此函数。第40页,本讲稿共69页10.7 10.7 重

37、载流插入运算符和流提取运算符重载流插入运算符和流提取运算符istream istream 类的对象类的对象cin;cin;Ostream Ostream 类的对象类的对象cout;cout;流插入运算符流插入运算符“”凡是用凡是用“coutcoutcin”对标准类型数据进行输入输对标准类型数据进行输入输出的,都要用出的,都要用#include#include 把头文件包含到本程序把头文件包含到本程序文件中。文件中。第41页,本讲稿共69页如果想直接用如果想直接用“”输出和输入自己声明的类型输出和输入自己声明的类型的数据,必须对它们重载。的数据,必须对它们重载。对对“”重载的函数形式如下:重载的

38、函数形式如下:istream&operator (istream&,istream&operator (istream&,自定义类自定义类&);&);ostream&operator (ostream&,ostream&operator”的函数的第一个参数和函数的类型都必须是的函数的第一个参数和函数的类型都必须是istream&istream&类型,第二个参数是要进行输入操作的类。类型,第二个参数是要进行输入操作的类。重载重载“”和和“”的函数作为的函数作为友元友元函数或函数或普通普通的函数,的函数,而不能将它们定义为成员函数。而不能将它们定义为成员函数。第42页,本讲稿共69页例例10.7

39、10.7 在例在例10.210.2的基础上,用重载的基础上,用重载“”输出复数。输出复数。#include using namespace std;class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex&c2);/运算符运算符“+”重载为成员函重载为成员函 数数friend ostream&operator (ostream&,Complex&);/运算符运算符“”重载为友元函数重载为友元函数private:10.7.1 10.7.1

40、 重载流插入运算符重载流插入运算符“”第43页,本讲稿共69页double real;double imag;Complex Complex operator+(Complex&c2)/定义运算符定义运算符“+”重载重载函数函数return Complex(real+c2.real,imag+c2.imag);ostream&operator (ostream&output,Complex&c)/定义运定义运算符算符“”重载函数重载函数output(c.real+c.imagi)endl;return output;/连续向输出流插入信息连续向输出流插入信息int main()Complex

41、c1(2,4),c2(6,10),c3;c3=c1+c2;coutc3;return 0;coutc3解释为:解释为:operator(cout,c3)第44页,本讲稿共69页运行结果为:运行结果为:(8+14i)(8+14i)连续向输出流插入信息连续向输出流插入信息coutc3c2;coutc3c2;先处理先处理coutc3coutc3,即:,即:(coutc3)c2;(coutc3)c2;而执行而执行(coutc3)(coutc3)得到的结果就是具有新内容的流对象得到的结果就是具有新内容的流对象coutcout,因,因此,此,(coutc3)c2(coutc3)c2相当于相当于cout(c

42、out(新值新值)c2)c2。运算符。运算符“”左侧左侧是是ostreamostream类对象类对象coutcout,右侧是,右侧是ComplexComplex类对象类对象c2,c2,则再次调用运则再次调用运算符算符“”重载函数,接着向输出流插入重载函数,接着向输出流插入c2c2的数据。现在可以理解了的数据。现在可以理解了为什么为什么C+C+规定运算符规定运算符“”重载函数的第一个参数和函数的类型重载函数的第一个参数和函数的类型都必须是都必须是ostreamostream类型的引用,就是为了返回类型的引用,就是为了返回coutcout的当前值以便连续的当前值以便连续输出。输出。第45页,本讲稿

43、共69页请读者注意区分什么情况下的请读者注意区分什么情况下的“”是标准是标准类型数据的流插入符,什么情况下的类型数据的流插入符,什么情况下的“”是重载的流插入符。如:是重载的流插入符。如:coutc3coutc35endl;5endl;有下划线的是调用重载的流插入符,后面两有下划线的是调用重载的流插入符,后面两个个“”不是重载的流插入符,因为它的右不是重载的流插入符,因为它的右侧不是侧不是ComplexComplex类对象而是标准类型的数据,类对象而是标准类型的数据,是用预定义的流插入符处理的。是用预定义的流插入符处理的。第46页,本讲稿共69页还有一点要说明:还有一点要说明:在本程序中,在在

44、本程序中,在ComplexComplex类中定义了运算符类中定义了运算符“”重载函数为友元函重载函数为友元函数,因此只有在输出数,因此只有在输出ComplexComplex类对象时才能类对象时才能使用重载的运算符,对其他类型的对象是无使用重载的运算符,对其他类型的对象是无效的。如效的。如couttime1;/time1cout”的作用是从一个输入流中提取数的作用是从一个输入流中提取数据,如据,如“cini;cini;”表示从输入流中提取一个整数赋给变量表示从输入流中提取一个整数赋给变量i(i(假设已定义假设已定义i i为为intint型型)。重载流提取运算符的目的是重载流提取运算符的目的是希望

45、将希望将“”用于输入自定义类型的对象的信息。用于输入自定义类型的对象的信息。10.7.2 10.7.2 重载流提取运算符重载流提取运算符“”第48页,本讲稿共69页例例10.8 在例在例10.7的基础上,增加重载流提取运算符的基础上,增加重载流提取运算符“”,用,用“cin”输入复数,用输入复数,用“cout”输出复数。输出复数。#include using namespace std;class Complexpublic:friend ostream&operator (istream&,Complex&);private:double real;double imag;ostream&o

46、perator (ostream&output,Complex&c)output(c.real+c.imag(istream&input,Complex&c)第49页,本讲稿共69页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 6 input real part and imaginary part of c

47、omplex number:4 10 c1=(3+6i)c2=(4+10i)第50页,本讲稿共69页虚部如果是负数,就不理想,请观察输出结果。虚部如果是负数,就不理想,请观察输出结果。input real part and imaginary part of complex number:3 6 input real part and imaginary part of complex number:4-10 c1=(3+6i)c2=(4+-10i)将重载运算符将重载运算符“”函数修改如下:函数修改如下:ostream&operator (ostream&output,Complex&c)ou

48、tput(=0)output+”;/虚部为正数时,在前加虚部为正数时,在前加“+”号号outputc.imagi)endl;/虚部为负数时,不加虚部为负数时,不加“+”号号return output;这样,运行时输出的最后一行为这样,运行时输出的最后一行为c2=(4-10i)。第51页,本讲稿共69页运算符重载中使用引用运算符重载中使用引用(reference)(reference)的重要的重要性性:利用引用作为函数的形参可以在调用函数的过程中通过利用引用作为函数的形参可以在调用函数的过程中通过传传址方式址方式使形参成为实参的别名,因此不生成临时变量使形参成为实参的别名,因此不生成临时变量(实

49、参实参的副本的副本),减少了时间和空间的开销,减少了时间和空间的开销如果重载函数的返回值是对象的引用时,返回的不是常量,如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在赋值号的左侧而成而是引用所代表的对象,它可以出现在赋值号的左侧而成为左值为左值(left value)(left value),可以被赋值或参与其他操作,可以被赋值或参与其他操作(如保留如保留coutcout流的当前值以便能连续使用流的当前值以便能连续使用“”输出输出)。使用引用时要特别小心,因为修改了引用就等于修改使用引用时要特别小心,因为修改了引用就等于修改了它所代表的对象。了它所代表的

50、对象。第52页,本讲稿共69页 隐式类型转换隐式类型转换 显式类型转换显式类型转换在在C+C+中,某些不同类型数据之间可以自动转换,例如:中,某些不同类型数据之间可以自动转换,例如:int i=6;int i=6;i=7.5+i;i=7.5+i;int double double int double double这种转换是由这种转换是由C+C+编译系统自动完成的,用户不需干预。这种转换称编译系统自动完成的,用户不需干预。这种转换称为隐式类型转换。为隐式类型转换。10.8 10.8 不同类型数据间的转换不同类型数据间的转换 10.8.1 10.8.1 标准类型数据间的转换标准类型数据间的转换第

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 资格考试

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁