书签 分享 收藏 举报 版权申诉 / 69
上传文档赚钱

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

  • 上传人(卖家):晟晟文业
  • 文档编号:3860573
  • 上传时间:2022-10-19
  • 格式:PPT
  • 页数:69
  • 大小:200.29KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《第10章运算符重载课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    10 运算 重载 课件
    资源描述:

    1、第第1010章章 运算符重载运算符重载10.1 10.1 什么是运算符重载什么是运算符重载10.2 10.2 运算符重载的方法运算符重载的方法10.3 10.3 重载运算符的规则重载运算符的规则10.4 10.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数10.5 10.5 重载双目运算符重载双目运算符10.6 10.6 重载单目运算符重载单目运算符10.7 10.7 重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符10.8 10.8 不同类型数据间的转换不同类型数据间的转换函数重载就是对一个已有的函数赋予新的含义,函数重载就是对一个已有的函数赋予

    2、新的含义,使之实现新功能。使之实现新功能。用户能根据自己的需要对用户能根据自己的需要对C+C+已提供的运算符进已提供的运算符进行行重载重载,赋予它们新的含义,使之,赋予它们新的含义,使之一名多用一名多用。例如例如10.1 10.1:用:用“+”“+”号进行两个复数的相加。在号进行两个复数的相加。在C+C+中不能在程序中直接用运算符中不能在程序中直接用运算符“+”“+”对复数进行对复数进行相加运算。用户必须自己设法实现复数相加。相加运算。用户必须自己设法实现复数相加。10.1 10.1 什么是运算符重载什么是运算符重载例例10.1 通过函数来实现复数相加。通过函数来实现复数相加。#include

    3、 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 real;/实部实部double imag;/虚部虚部;Complex Complex complex_add(Comple

    4、x&c2)Complex c;c.real=real+c2.real;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();/输出输出c1的值的值coutc2=;c2.display();/输出输出c2的值的值coutc1+c2=;c3.display();/输出输

    5、出c3的值的值return 0;运行结果如下:运行结果如下:c1=(3,4i)c2=(5,-10i)c1+c2=(8,-6i)能否直接用加号能否直接用加号“+”来实来实现复数运算呢?如现复数运算呢?如:c3=c1+c2;运算符重载的方法是定义一个重载运算符的函数,运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。重载运算符的函数一般函数,以实现相应的运算。重载运算符的函数一般格式如下:格式如下:函数类型函数类型 operator operator 运算符名称运算符名称(形参表列形参表列)对

    6、运算符的重载处理对运算符的重载处理 例如,想将例如,想将“+”“+”用于用于ComplexComplex类类(复数复数)的加法运算,的加法运算,函数的原型可以是这样的:函数的原型可以是这样的:Complex operator+(Complex&c1,Complex&c2);Complex operator+(Complex&c1,Complex&c2);10.2 10.2 运算符重载的方法运算符重载的方法在定义了重载运算符的函数后,可以说:在定义了重载运算符的函数后,可以说:函数函数operator+operator+重载了运算符重载了运算符+。为了说明在运算符重载。为了说明在运算符重载后,执

    7、行表达式就是调用函数的过程,可以把两个后,执行表达式就是调用函数的过程,可以把两个整数相加也想像为调用下面的函数:整数相加也想像为调用下面的函数:int operator+(int a,int b)return(a+b);如果有表达式如果有表达式5+85+8,就调用此函数,将,就调用此函数,将5 5和和8 8作为调作为调用函数时的实参,函数的返回值为用函数时的实参,函数的返回值为1313。这就是用函。这就是用函数的方法理解运算符。数的方法理解运算符。例例10.2 改写例改写例10.1,重载运算符,重载运算符“+”,使之能用于两个复数,使之能用于两个复数相加。相加。#include using

    8、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;Complex Complex operator+(Complex&c2)/定义重载运算定义重载运算符的函数符的函数 Complex c;c.real=real+c2.real;c.imag=imag+c2.i

    9、mag;operator+取代了取代了 complex_add隐含隐含this指针指针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();coutc2=;c2.display();coutreal+c2.realthis-real+c2.real,this-this-realreal就是就是c1.realc1.real。10.4 10.4 运算符重载函数作为类成员函数

    10、和友元函数运算符重载函数作为类成员函数和友元函数例例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 operator+(Complex&c1,Complex&c2);/重重载函数作为友元函数载函数作

    11、为友元函数void display();private:double real;double imag;Complex operator+(Complex&c1,Complex&c2)/定义友定义友元函数的重载函数在类外访问私有成员元函数的重载函数在类外访问私有成员return Complex(c1.real+c2.real,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=

    12、;c2.display();coutc1+c2=;c3.display();operator+(c1,c2)何种情况下选择运何种情况下选择运算符重载函数为类的成员函数、类算符重载函数为类的成员函数、类的友元函数和普通函数:的友元函数和普通函数:普通函数不能直接访问类的私有成员,极少选用。普通函数不能直接访问类的私有成员,极少选用。如果将运算符重载函数作为如果将运算符重载函数作为成员函数成员函数,它可以通过,它可以通过thisthis指针自由地访问本类的数据成员,可以少写一个指针自由地访问本类的数据成员,可以少写一个函数的参数。但必须要求运算表达式第一个参数函数的参数。但必须要求运算表达式第一个

    13、参数(即即运算符左侧的操作数运算符左侧的操作数)是一个是一个类对象。类对象。左侧的操作数是标准类型左侧的操作数是标准类型就要使用就要使用友元函数友元函数(访问私访问私有成员有成员)例如:将一个复数和一个整数相加,如例如:将一个复数和一个整数相加,如c1+ic1+i,可以将,可以将运算符重载函数作为成员函数,如下面的形式:运算符重载函数作为成员函数,如下面的形式:Complex Complexoperator+(int&i)Complex Complexoperator+(int&i)return Complex(real+i,imag);return Complex(real+i,imag);

    14、注意注意在表达式中重载的运算符在表达式中重载的运算符“+”“+”左侧应为左侧应为ComplexComplex类的对象,如:类的对象,如:c3=c2+i;c3=c2+i;不能写成不能写成c3=i+c2;c3=i+c2;/运算符运算符“+”“+”的左侧不是类对象,编译出的左侧不是类对象,编译出错错如果出于某种考虑,要求在使用重载运算符时运算如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式符左侧的操作数是整型量(如表达式i+c2i+c2,运算符,运算符左侧的操作数左侧的操作数i i是整数),这时是无法利用前面定是整数),这时是无法利用前面定义的重载运算符的,因为无法调用义

    15、的重载运算符的,因为无法调用i.operator+i.operator+函函数。可想而知,如果运算符左侧的操作数属于数。可想而知,如果运算符左侧的操作数属于C+C+标准类型标准类型(如如int)int)或是一个其他类的对象,则运算或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能作为非成员函符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问类的私有成员,则必须声明数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在为友元函数。可以在ComplexComplex类中声明:类中声明:friend Complex operator+(int&i,Complex&c)

    16、;friend Complex operator+(int&i,Complex&c);/在类外定义友元函数:在类外定义友元函数:Complex operator+(int&i,Complex&c)Complex operator+(int&i,Complex&c)return Complex(i+c.real,c.imag);return Complex(i+c.real,c.imag);将双目运算符重载为友元函数时,将双目运算符重载为友元函数时,在函数的形参在函数的形参表列中必须有两个参数,不能省略,形参的顺序任表列中必须有两个参数,不能省略,形参的顺序任意,不要求第一个参数必须为类对象。但

    17、在使用运意,不要求第一个参数必须为类对象。但在使用运算符的表达式中,要求运算符左侧的操作数与函数算符的表达式中,要求运算符左侧的操作数与函数第一个参数对应,运算符右侧的操作数与函数的第第一个参数对应,运算符右侧的操作数与函数的第二个参数对应。如二个参数对应。如c3=i+c2;c3=i+c2;/正确,类型匹配正确,类型匹配c3=c2+ic3=c2+i;/错误,类型不匹配错误,类型不匹配注意:注意:数学上的交换律在此不适用。如果希望适用数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运算符交换律,则应再重载一次运算符“+”“+”。如。如Complex operator+(Complex

    18、&c,int&i)Complex operator+(Complex&c,int&i)/此时第一个参数为类对象此时第一个参数为类对象return Complex(i+c.real,c.imag);return Complex(i+c.real,c.imag);C+C+规定,有的运算符规定,有的运算符(如赋值运算符、下标运算符、如赋值运算符、下标运算符、函数调用运算符函数调用运算符)必须定义为类的成员函数,有的必须定义为类的成员函数,有的运算符则不能定义为类的成员函数运算符则不能定义为类的成员函数(如流插入如流插入“”“”“”、类型转换运算符、类型转换运算符)。由于友元的使用会破坏类的封装,因此

    19、从原则上由于友元的使用会破坏类的封装,因此从原则上说,说,一般将单目运算符重载为成员函数,将双目运一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。算符重载为友元函数。说明:说明:有的有的C+C+编译系统编译系统(如如Visual C+6.0)Visual C+6.0)没有没有完全实现完全实现C+C+标准,它所提供不带后缀标准,它所提供不带后缀.h.h的头文件的头文件不支持把成员函数重载为友元函数。但是不支持把成员函数重载为友元函数。但是Visual Visual C+C+所提供的老形式的带后缀所提供的老形式的带后缀.h.h的头文件可以支持的头文件可以支持此项功能,因此可以将程序头两

    20、行修改如下,即可此项功能,因此可以将程序头两行修改如下,即可顺利运行:顺利运行:#include#include 以后如遇到类似情况,亦可照此办理。以后如遇到类似情况,亦可照此办理。双目运算符双目运算符(或称二元运算符或称二元运算符)是是C+C+中最常用的运中最常用的运算符。双目运算符有两个操作数,通常在运算符的算符。双目运算符有两个操作数,通常在运算符的左右两侧。左右两侧。例例10.4 10.4 定义一个字符串类定义一个字符串类StringString,用来存放不定长的,用来存放不定长的字符串,重载运算符字符串,重载运算符“=”,“”“=”,“”“”,用于,用于两个字符串的等于、小于和大于的

    21、比较运算。两个字符串的等于、小于和大于的比较运算。10.5 10.5 重载双目运算符重载双目运算符编程过程编程过程:(1)先建立一个先建立一个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指向实参字符串指向实参字符

    22、串void String display()/输出输出p所指向的字符串所指向的字符串coutp;int main()String string1(Hello),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();p

    23、rivate:char*p;/字符型指针,用于指向字符串字符型指针,用于指向字符串;String String(char*str)p=str;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&string

    24、1,String&string2);friend bool operator(String&string1,String&string2)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;bool operator=(String&string1,String&string2)if(strcmp(string1.

    25、p,string2.p)=0)return true;elsereturn false;int main()String string1(Hello),string2(Book),string3(Computer);coutstring2)endl;/比较结果应该为比较结果应该为truecout(string1string3)endl;/比较结果应该为比较结果应该为false cout(string1=string2)endl;/比较结果应该为比较结果应该为false return 0;运行结果为运行结果为:100(4)再进一步修饰完善,下面给出最后的程序。再进一步修饰完善,下面给出最后的程序

    26、。#include using namespace std;class Stringpublic: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;String String(char*str)p=str;voi

    27、d String display()/输出输出p所指向的字符串所指向的字符串cout(String&string1,String&string2)if(strcmp(string1.p,string2.p)0)return true;elsereturn false;bool operator(String&string1,String&string2)if(strcmp(string1.p,string2.p)(string1,string2)=1)string1.display();cout;string2.display();elseif(operator(string1,string2

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

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

    30、,&c&c,*p p,还有最常用的,还有最常用的+i+i和和-i-i等。等。单目运算符只有一个操作数,因此运算符重载单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。函数,则还可省略此参数。下面以自增运算符下面以自增运算符“+”“+”为例,介绍单目运算符的为例,介绍单目运算符的重载。重载。10.6 10.6 重载单目运算符重载单目运算符例例10.5 10.5 有一个有一个TimeTime类,包含数据成员类,包含数据成员minute(minute(分分)和和sec(sec(秒秒),模拟秒表,每次

    31、走一秒,满,模拟秒表,每次走一秒,满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)sec-=60;/满满60秒进秒进1分钟分钟+minute;r

    32、eturn*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+:C+约定:约定:在自增在自增(自减自减)运算符重载函运算符重载函数中,增加一个数中,增加一个intint型形参,就是后置自增型形参,就是后置自增(自减自减)运

    33、算符函运算符函数。数。例例10.6 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 operator+(int);/声明后置自增运算符声明后置自增运算符“+”重载函数重载函数void display()coutmin

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

    35、y();time2=time1+;/将自加前的对象的值赋给将自加前的对象的值赋给time2couttime1+:;time1.display();cout time2:;time2.display();/输出输出time2对象的值对象的值运行结果如下:运行结果如下:time1:34:59 time1:34:59 (time1原值原值)+time1:35:0 +time1:35:0 (执行执行+time1后后time1的值的值)time1+:35:1 time1+:35:1(再执行再执行time1+后后time1的值的值)time2:35:0 time2:35:0 (time2保存的是执行保存的

    36、是执行time1+前前time1的的值值)可以看到:可以看到:重载后置自增运算符时,多了一个重载后置自增运算符时,多了一个intint型的参数,增加这个参数只是为了与前置自增运算型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用。编译系符重载函数有所区别,此外没有任何作用。编译系统在遇到重载后置自增运算符时,会自动调用此函统在遇到重载后置自增运算符时,会自动调用此函数。数。10.7 10.7 重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符istream istream 类的对象类的对象cin;cin;Ostream Ostream 类的对象类的对象c

    37、out;cout;流插入运算符流插入运算符“”“”“”凡是用凡是用“cout”“cout”“cin”对标准类型数据进行对标准类型数据进行输入输出的,都要用输入输出的,都要用#include#include 把头文件包把头文件包含到本程序文件中。含到本程序文件中。如果想直接用如果想直接用“”“”“”输出和输入自己声明输出和输入自己声明的类型的数据,必须对它们重载。的类型的数据,必须对它们重载。对对“”“”“”重载的函数形式如下:重载的函数形式如下:istream&operator (istream&,istream&operator (istream&,自定义类自定义类&);&);ostream

    38、&operator (ostream&,ostream&operator”“”的函数的第一个参数和函数的类型都必的函数的第一个参数和函数的类型都必须是须是istream&istream&类型,第二个参数是要进行输入操作的类。类型,第二个参数是要进行输入操作的类。重载重载“”“”“”和和“”“”的函数作为的函数作为友元友元函数或函数或普通普通的的函数,而不能将它们定义为成员函数。函数,而不能将它们定义为成员函数。例例10.7 10.7 在例在例10.210.2的基础上,用重载的基础上,用重载“”“”输出复数。输出复数。#include using namespace std;class Comp

    39、lexpublic: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 重载流插入运算符重载流插入运算符“”“”double real;double imag;Complex Complex operator+(Complex&c2)/定

    40、义运算符定义运算符“+”重载函数重载函数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 c1(2,4),c2(6,10),c3;c3=c1+c2;coutc3;return 0;coutc3解释为:解释为:operator(cout,c3)运行结果为:运行结果为:(8+14i

    41、)(8+14i)连续向输出流插入信息连续向输出流插入信息coutc3c2;coutc3c2;先处理先处理coutc3coutc3,即:,即:(coutc3)c2;(coutc3)c2;而执行而执行(coutc3)(coutc3)得到的结果就是具有新内容的流对象得到的结果就是具有新内容的流对象coutcout,因此,因此,(coutc3)c2(coutc3)c2相当于相当于cout(cout(新值新值)c2)c2。运。运算符算符“”“”左侧是左侧是ostreamostream类对象类对象coutcout,右侧是,右侧是ComplexComplex类类对象对象c2,c2,则再次调用运算符则再次调用

    42、运算符“”“”重载函数,接着向输出流重载函数,接着向输出流插入插入c2c2的数据。现在可以理解了为什么的数据。现在可以理解了为什么C+C+规定运算符规定运算符“”“”重载函数的第一个参数和函数的类型都必须是重载函数的第一个参数和函数的类型都必须是ostreamostream类型类型的引用,就是为了返回的引用,就是为了返回coutcout的当前值以便连续输出。的当前值以便连续输出。请读者注意区分什么情况下的请读者注意区分什么情况下的“”“”是标准是标准类型数据的流插入符,什么情况下的类型数据的流插入符,什么情况下的“”“”是重载的流插入符。如:是重载的流插入符。如:coutc3coutc35en

    43、dl;5endl;有下划线的是调用重载的流插入符,后面两有下划线的是调用重载的流插入符,后面两个个“”“”不是重载的流插入符,因为它的右不是重载的流插入符,因为它的右侧不是侧不是ComplexComplex类对象而是标准类型的数据,类对象而是标准类型的数据,是用预定义的流插入符处理的。是用预定义的流插入符处理的。还有一点要说明:还有一点要说明:在本程序中,在在本程序中,在ComplexComplex类中定义了运算符类中定义了运算符“”“”重载函数为友元函重载函数为友元函数,因此只有在输出数,因此只有在输出ComplexComplex类对象时才能类对象时才能使用重载的运算符,对其他类型的对象是无

    44、使用重载的运算符,对其他类型的对象是无效的。如效的。如couttime1;/time1cout”“”的作用是从一个输入流的作用是从一个输入流中提取数据,如中提取数据,如“cini;”“cini;”表示从输入流中提取表示从输入流中提取一个整数赋给变量一个整数赋给变量i(i(假设已定义假设已定义i i为为intint型型)。重载重载流提取运算符的目的是希望将流提取运算符的目的是希望将“”“”用于输入自定用于输入自定义类型的对象的信息。义类型的对象的信息。10.7.2 10.7.2 重载流提取运算符重载流提取运算符“”“”例例10.8 在例在例10.7的基础上,增加重载流提取运算符的基础上,增加重载

    45、流提取运算符“”,用用“cin”输入复数,用输入复数,用“cout”输出复数。输出复数。#include using namespace std;class Complexpublic:friend ostream&operator (istream&,Complex&);private:double real;double imag;ostream&operator (ostream&output,Complex&c)output(c.real+c.imag(istream&input,Complex&c)coutc.realc.imag;return input;int main()Com

    46、plex 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 complex number:4 10 c1=(3+6i)c2=(4+10i)虚部如果是负数,就不理想,请观察输出结果。虚部如果是负数,就不理想,请观察输出结果。input real part and imaginary part of complex number:3

    47、 6 input real part and imaginary part of complex number:4-10 c1=(3+6i)c2=(4+-10i)将重载运算符将重载运算符“”函数修改如下:函数修改如下:ostream&operator (ostream&output,Complex&c)output(=0)output+”;/虚部为正数时,在前加虚部为正数时,在前加“+”号号outputc.imagi)endl;/虚部为负数时,不加虚部为负数时,不加“+”号号return output;这样,运行时输出的最后一行为这样,运行时输出的最后一行为c2=(4-10i)。运算符重载中使

    48、用引用运算符重载中使用引用(reference)(reference)的重要的重要性性:利用引用作为函数的形参可以在调用函数的过程利用引用作为函数的形参可以在调用函数的过程中通过中通过传址方式传址方式使形参成为实参的别名,因此不生使形参成为实参的别名,因此不生成临时变量成临时变量(实参的副本实参的副本),减少了时间和空间的开,减少了时间和空间的开销销如果重载函数的返回值是对象的引用时,返回的如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在不是常量,而是引用所代表的对象,它可以出现在赋值号的左侧而成为左值赋值号的左侧而成为左值(left value)(lef

    49、t value),可以被赋,可以被赋值或参与其他操作值或参与其他操作(如保留如保留coutcout流的当前值以便能流的当前值以便能连续使用连续使用“”“”输出输出)。使用引用时要特别小心,因为修改了引用就等于使用引用时要特别小心,因为修改了引用就等于修改了它所代表的对象。修改了它所代表的对象。隐式类型转换隐式类型转换 显式类型转换显式类型转换在在C+C+中,某些不同类型数据之间可以自动转换,例如:中,某些不同类型数据之间可以自动转换,例如:int i=6;int i=6;i=7.5+i;i=7.5+i;int double double int double double这种转换是由这种转换是

    50、由C+C+编译系统自动完成的,用户不需干预。这编译系统自动完成的,用户不需干预。这种转换称为隐式类型转换。种转换称为隐式类型转换。10.8 10.8 不同类型数据间的转换不同类型数据间的转换 10.8.1 10.8.1 标准类型数据间的转换标准类型数据间的转换C+C+还提供显式类型转换,程序人员在程序中指定还提供显式类型转换,程序人员在程序中指定将一种指定的数据转换成另一指定的类型,其形式将一种指定的数据转换成另一指定的类型,其形式为为 类型名类型名(数据数据)如:如:int(89.5)int(89.5);其作用是将其作用是将89.589.5转换为整型数转换为整型数8989。对于用户自己声明的

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第10章运算符重载课件.ppt
    链接地址:https://www.163wenku.com/p-3860573.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库