《运算符重载 》PPT课件

上传人:M****1 文档编号:579318301 上传时间:2024-08-26 格式:PPT 页数:69 大小:602.50KB
返回 下载 相关 举报
《运算符重载 》PPT课件_第1页
第1页 / 共69页
《运算符重载 》PPT课件_第2页
第2页 / 共69页
《运算符重载 》PPT课件_第3页
第3页 / 共69页
《运算符重载 》PPT课件_第4页
第4页 / 共69页
《运算符重载 》PPT课件_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《《运算符重载 》PPT课件》由会员分享,可在线阅读,更多相关《《运算符重载 》PPT课件(69页珍藏版)》请在金锄头文库上搜索。

1、电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学第第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 重载流插入运算符和流提取运算符重载

2、流插入运算符和流提取运算符10.8 10.8 不同类型数据间的转换不同类型数据间的转换电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学函数重载就是对一个已有的函数赋予新的含义,函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。使之实现新功能。用户能根据自己的需要对用户能根据自己的需要对C+C+已提供的运算符进行已提供的运算符进行重载重载,赋予它们新的含义,使之,赋予它们新的含义,使之一名多用一名多用。例如例如10.1 10.1 :用:用“+”+”号进行两个复数的相加。在号进行

3、两个复数的相加。在C+C+中不能在程序中直接用运算符中不能在程序中直接用运算符“+”+”对复数进行对复数进行相加运算。用户必须自己设法实现复数相加。相加运算。用户必须自己设法实现复数相加。10.1 10.1 什么是运算符重载什么是运算符重载电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.1 通过函数来实现复数相加。通过函数来实现复数相加。#include using namespace std;class Complex /定义定义Complex类类public:Compl

4、ex( )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(Complex &c2)Complex c;c.real=real+c2.real;电子与信息工程系电子与信息工程系

5、COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学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( )

6、; /输出输出c2的值的值coutc1+c2=; c3.display( ); /输出输出c3的值的值return 0;运行结果如下:运行结果如下: c1=(3,4i)c2=(5,-10i)c1+c2=(8,-6i)能否直接用加号能否直接用加号“+”来实来实现复数运算呢?如现复数运算呢?如:c3=c1+c2;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学运算符重载的方法是定义一个重载运算符的函数,运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用

7、该在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。重载运算符的函数一般函数,以实现相应的运算。重载运算符的函数一般格式如下:格式如下: 函数类型函数类型 operator operator 运算符名称运算符名称 ( (形参表列形参表列) ) 对运算符的重载处理对运算符的重载处理 例如,想将例如,想将“+”+”用于用于ComplexComplex类类( (复数复数) )的加法运算,的加法运算,函数的原型可以是这样的:函数的原型可以是这样的: Complex operator+ (Complex& c1,Complex& c2);Complex operator+ (Compl

8、ex& c1,Complex& c2);10.2 10.2 运算符重载的方法运算符重载的方法电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学在定义了重载运算符的函数后,可以说:在定义了重载运算符的函数后,可以说:函数函数operator+operator+重载了运算符重载了运算符+ +。为了说明在运算符重载为了说明在运算符重载后,执行表达式就是调用函数的过程,可以把两个后,执行表达式就是调用函数的过程,可以把两个整数相加也想像为调用下面的函数:整数相加也想像为调用下面的函数: int

9、 operator + (int a,int b)return (a+b);如果有表达式如果有表达式5+85+8,就调用此函数,将,就调用此函数,将5 5和和8 8作为调作为调用函数时的实参,函数的返回值为用函数时的实参,函数的返回值为1313。这就是用函。这就是用函数的方法理解运算符。数的方法理解运算符。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.2 改写例改写例10.1,重载运算符,重载运算符“+”,使之能用于两个复数,使之能用于两个复数相加。相加。#include

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

11、imag=imag+c2.imag;operator+取代了取代了 complex_add隐含隐含this指针指针电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学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.displ

12、ay( );coutreal+c2.realthis-real+c2.real,this-this-realreal就是就是c1.realc1.real。10.4 10.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.3 将运算符将运算符“+”重载为适用于复数加法,重载为适用于复数加法,重载函数重载函数不作不作为成员函数,而放在类外,为成员函数,而放在类外,作为作为Complex类的类的友元函数

13、友元函数。#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); /重载函数作为友元函数重载函数作为友元函数void display( ); private:double real;double imag; ;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC

14、+C+程序设计程序设计 网网 络络 教教 学学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=; c2.display( );cou

15、tc1+c2 =; c3.display( );operator+(c1,c2)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学何种情况下选择运何种情况下选择运算符重载函数为类的成员函数、类算符重载函数为类的成员函数、类的友元函数和普通函数:的友元函数和普通函数:普通函数不能直接访问类的私有成员,极少选用。普通函数不能直接访问类的私有成员,极少选用。如果将运算符重载函数作为如果将运算符重载函数作为成员函数成员函数,它可以通过,它可以通过thisthis指针自由地访问本类的数据成员,可

16、以少写一个指针自由地访问本类的数据成员,可以少写一个函数的参数。但必须要求运算表达式第一个参数函数的参数。但必须要求运算表达式第一个参数( (即运即运算符左侧的操作数算符左侧的操作数) )是一个是一个类对象。类对象。左侧的操作数是标准类型左侧的操作数是标准类型就要使用就要使用友元函数友元函数( (访问私访问私有成员有成员) )电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例如:将一个复数和一个整数相加,如例如:将一个复数和一个整数相加,如c1+ic1+i,可以将可以将运算符重载函数

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

18、,编译出错错电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学如果出于某种考虑,要求在使用重载运算符时运算如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式符左侧的操作数是整型量(如表达式i+c2i+c2,运算符运算符左侧的操作数左侧的操作数i i是整数),这时是无法利用前面定是整数),这时是无法利用前面定义的重载运算符的,因为无法调用义的重载运算符的,因为无法调用i.operator+i.operator+函函数。可想而知,如果运算符左侧的操作数属于数。可想

19、而知,如果运算符左侧的操作数属于C+C+标准类型标准类型( (如如intint) )或是一个其他类的对象,则运算或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能作为非成员函符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问类的私有成员,则必须声明数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在为友元函数。可以在ComplexComplex类中声明:类中声明: 电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学friend Complex frie

20、nd Complex operator+(intoperator+(int &i,Complex &c); &i,Complex &c); /在在类外定义友元函数:类外定义友元函数: Complex Complex operator+(intoperator+(int &i, Complex &c) &i, Complex &c) return return Complex(i+c.real,c.imagComplex(i+c.real,c.imag););将双目运算符重载为友元函数时,将双目运算符重载为友元函数时,在函数的形参在函数的形参表列中必须有两个参数,不能省略,形参的顺序任表列中必须

21、有两个参数,不能省略,形参的顺序任意,不要求第一个参数必须为类对象。但在使用运意,不要求第一个参数必须为类对象。但在使用运算符的表达式中,要求运算符左侧的操作数与函数算符的表达式中,要求运算符左侧的操作数与函数第一个参数对应,运算符右侧的操作数与函数的第第一个参数对应,运算符右侧的操作数与函数的第二个参数对应。如二个参数对应。如c3=i+c2;c3=i+c2; /正确,类型匹配正确,类型匹配c3=c2+ic3=c2+i; /错误,类型不匹配错误,类型不匹配电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网

22、网 络络 教教 学学注意:注意:数学上的交换律在此不适用。如果希望适用数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运算符交换律,则应再重载一次运算符“+”+”。如。如Complex operator+(Complex &c, Complex operator+(Complex &c, intint &i) &i) /此时第一个参数为类对象此时第一个参数为类对象return return Complex(i+c.real,c.imagComplex(i+c.real,c.imag););C+C+规定,有的运算符规定,有的运算符( (如赋值运算符、下标运算符、如赋值运算符、下标运算

23、符、函数调用运算符函数调用运算符) )必须定义为类的成员函数,有的必须定义为类的成员函数,有的运算符则不能定义为类的成员函数运算符则不能定义为类的成员函数( (如流插入如流插入“”、类型转换运算符、类型转换运算符) )。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学由于友元的使用会破坏类的封装,因此从原则上由于友元的使用会破坏类的封装,因此从原则上说,说,一般将单目运算符重载为成员函数,将双目运一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。算符重载为友元函数。说明:说

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

25、照此办理。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学双目运算符双目运算符( (或称二元运算符或称二元运算符) )是是C+C+中最常用的运中最常用的运算符。双目运算符有两个操作数,通常在运算符的算符。双目运算符有两个操作数,通常在运算符的左右两侧。左右两侧。例例10.4 10.4 定义一个字符串类定义一个字符串类StringString,用来存放不定长的,用来存放不定长的字符串,重载运算符字符串,重载运算符“=”,“”=”,“”,用于,用于两个字符串的等于、小于和大于的比较运算。

26、两个字符串的等于、小于和大于的比较运算。10.5 10.5 重载双目运算符重载双目运算符电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学编程过程编程过程: :(1) 先建立一个先建立一个String类:类: #include using namespace std;class Stringpublic:String( )p=NULL; /默认构造函数默认构造函数String(char *str); /构造函数构造函数void display( );private:char *p; /

27、字符型指针,用于指向字符串字符型指针,用于指向字符串;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学String String(char *str) /定义构造函数定义构造函数p=str; /使使p指向实参字符串指向实参字符串void String display( ) /输出输出p所指向的字符串所指向的字符串coutp;int main( )String string1(Hello),string2(Book);string1.display( );cout”重载的部分。程序如下

28、:重载的部分。程序如下: #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;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY

29、 DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学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 b

30、ool 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;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学boo

31、l operator=(String &string1,String &string2) if(strcmp(string1.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; /比较结果应该为比较结果应该为f

32、alse return 0;运行结果为运行结果为:100电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学(4) 再进一步修饰完善,下面给出最后的程序。再进一步修饰完善,下面给出最后的程序。#include using namespace std;class Stringpublic:String( )p=NULL;String(char *str);friend bool operator(String &string1,String &string2);friend bool op

33、erator(String &string1,String &string2);friend bool operator=(String &string1,String &string2);void display( );private:char *p; 电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学String String(char *str)p=str;void String display( ) /输出输出p所指向的字符串所指向的字符串cout(String &string

34、1,String &string2)if(strcmp(string1.p,string2.p)0)return true;elsereturn false;bool operator(String &string1,String &string2)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学if(strcmp(string1.p,string2.p)(string1,string2)=1)string1.display( );cout;string2.display( );el

35、seif(operator(string1,string2)=1)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学string1.display( );cout;string2.display( );else if(operator=(string1,string2)=1)string1.display( );cout=;string2.display( );coutBookBookComputerHello=Hello电子与信息工程系电子与信息工程系COMPUTER SCIENCE

36、 & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学增加了一个增加了一个comparecompare函数,用来对两个字符串进行函数,用来对两个字符串进行比较,并输出相应的信息。这样可以减轻主函数的比较,并输出相应的信息。这样可以减轻主函数的负担,使主函数简明易读。负担,使主函数简明易读。编写编写C+C+程序的指导思想是:程序的指导思想是: 先搭框架,逐步扩先搭框架,逐步扩充,由简到繁,最后完善。充,由简到繁,最后完善。边编程,边调试,边扩边编程,边调试,边扩充。千万不要企图在一开始时就解决所有的细节。充。千万不要企图在一开始时就解决所有的细节。类是可

37、扩充的,可以一步一步地扩充它的功能。类是可扩充的,可以一步一步地扩充它的功能。最好直接在计算机上写程序,每一步都要上机调最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一步再做下一步,步步为营。试,调试通过了前面一步再做下一步,步步为营。这样编程和调试的效率是比较高的。这样编程和调试的效率是比较高的。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学 单目运算符只有一个操作数,如单目运算符只有一个操作数,如!a!a,-b-b,&c&c,* *p p,还有最常用的还有最常用的

38、+i+i和和-i-i等。等。 单目运算符只有一个操作数,因此运算符重载单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。函数,则还可省略此参数。下面以自增运算符下面以自增运算符“+”+”为例,介绍单目运算符的为例,介绍单目运算符的重载。重载。10.6 10.6 重载单目运算符重载单目运算符电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.5 10.5 有一个有一个TimeTi

39、me类,包含数据成员类,包含数据成员minute(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+( ); /声明运算符重载函数声明运算符重载

40、函数void display( )coutminute: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:2 34:5935:035:1 (共输出共输出61行行)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络

41、络 教教 学学“+”+”和和“-”-”运算符有两种使用方式运算符有两种使用方式: :前置自增运算符前置自增运算符: :后置自增运算符后置自增运算符:C+:C+约定:约定: 在自增在自增( (自减自减) )运算符重载函运算符重载函数中,增加一个数中,增加一个intint型形参,就是后置自增型形参,就是后置自增( (自减自减) )运算符函运算符函数。数。例例10.6 10.6 在上例基础上增加对后置自增运算符的重载。修改在上例基础上增加对后置自增运算符的重载。修改后的程序如下:后的程序如下:#include using namespace std;class Timepublic:Time( )m

42、inute=0;sec=0;Time(int m,int s):minute(m),sec(s)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学Time operator+( ); /声明前置自增运算符声明前置自增运算符“+”重载函数重载函数Time operator+(int); /声明后置自增运算符声明后置自增运算符“+”重载函数重载函数void display( )coutminute:sec=60)sec-=60;+minute;return *this; /返回自加后的当前

43、对象返回自加后的当前对象 Time Time operator+(int) /后置自增运算符后置自增运算符“+”重载函重载函数数Time temp(*this); /保存当前对象值保存当前对象值sec+;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学if(sec=60)sec-=60;+minute;return temp; /返回的是自加前的对象返回的是自加前的对象int main( )Time time1(34,59),time2;cout time1 : ;time1.dis

44、play( );+time1;cout+time1: ;time1.display( );time2=time1+; /将自加前的对象的值赋给将自加前的对象的值赋给time2couttime1+: ;time1.display( );cout time2 :;time2.display( ); /输出输出time2对象的值对象的值电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学运行结果如下:运行结果如下: time1 : 34:59 time1 : 34:59 (time1原值原值)

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

46、到重载后置自增运算符时,会自动调用此函统在遇到重载后置自增运算符时,会自动调用此函数。数。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学10.7 10.7 重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符istreamistream 类的对象类的对象cincin; ;OstreamOstream 类的对象类的对象coutcout; ; 流插入运算符流插入运算符“”凡是用凡是用“coutcout”对标准类型数据进行对标准类型数据进行输入输出的,都要用输入输出的,都要用#

47、#includeinclude 把头文件包把头文件包含到本程序文件中。含到本程序文件中。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学如果想直接用如果想直接用“”输出和输入自己声明输出和输入自己声明的类型的数据,必须对它们重载。的类型的数据,必须对它们重载。对对“”重载的函数形式如下:重载的函数形式如下: istreamistream & operator ( & operator (istreamistream &, &,自定义类自定义类 &);&);ostreamostream

48、 & operator ( & operator ”的函数的第一个参数和函数的类型都必的函数的第一个参数和函数的类型都必须是须是istreamistream& &类型,第二个参数是要进行输入操作的类。类型,第二个参数是要进行输入操作的类。重载重载“”和和“”的函数作为的函数作为友元友元函数或函数或普通普通的的函数,而不能将它们定义为成员函数。函数,而不能将它们定义为成员函数。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.7 10.7 在例在例10.210.2的基础上,用重

49、载的基础上,用重载“”输出复数。输出复数。 #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 重载流插入运算符重载流插入运

50、算符“”电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学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.im

51、agi)endl;return output; /连续向输出流插入信息连续向输出流插入信息int main( )Complex c1(2,4),c2(6,10),c3;c3=c1+c2;coutc3;return 0;coutc3解释为:解释为:operator(cout,c3)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学运行结果为:运行结果为:(8+14i)(8+14i)连续向输出流插入信息连续向输出流插入信息coutcoutc3c2;c3c2;先处理先处理coutcoutc3

52、c3,即:,即:( (coutcoutc3)c2;c3)c2;而执行而执行( (coutcoutc3)c3)得到的结果就是具有新内容的流对象得到的结果就是具有新内容的流对象coutcout,因此,因此,( (coutcoutc3)c2c3)c2相当于相当于coutcout( (新值新值)c2)c2。运。运算符算符“”左侧是左侧是ostreamostream类对象类对象coutcout,右侧是,右侧是ComplexComplex类类对象对象c2,c2,则再次调用运算符则再次调用运算符“”重载函数,接着向输出流重载函数,接着向输出流插入插入c2c2的数据。现在可以理解了为什么的数据。现在可以理解了

53、为什么C+C+规定运算符规定运算符“”重载函数的第一个参数和函数的类型都必须是重载函数的第一个参数和函数的类型都必须是ostreamostream类型的引用,就是为了返回类型的引用,就是为了返回coutcout的当前值以便连续的当前值以便连续输出。输出。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学请读者注意区分什么情况下的请读者注意区分什么情况下的“”是标准是标准类型数据的流插入符,什么情况下的类型数据的流插入符,什么情况下的“”是重载的流插入符。如:是重载的流插入符。如:cou

54、tcoutc3c355endlendl; ;有下划线的是调用重载的流插入符,后面两有下划线的是调用重载的流插入符,后面两个个“”不是重载的流插入符,因为它的右不是重载的流插入符,因为它的右侧不是侧不是ComplexComplex类对象而是标准类型的数据,类对象而是标准类型的数据,是用预定义的流插入符处理的。是用预定义的流插入符处理的。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学还有一点要说明:还有一点要说明: 在本程序中,在在本程序中,在ComplexComplex类中定义了运算

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

56、象的信息。义类型的对象的信息。10.7.2 10.7.2 重载流提取运算符重载流提取运算符“”电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.8 在例在例10.7的基础上,增加重载流提取运算符的基础上,增加重载流提取运算符“”,用用“cin”输入复数,用输入复数,用“cout”输出复数。输出复数。#include using namespace std;class Complexpublic:friend ostream& operator (istream&,Comple

57、x&); private:double real;double imag;ostream& operator (ostream& output,Complex& c) output(c.real+c.imag (istream& input,Complex& c)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学coutc.realc.imag;return input;int main( )Complex c1,c2;cinc1c2; coutc1=c1endl; coutc2=c2

58、endl;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)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学虚部如果是负数,就不理想,请观察输出结果。虚部如果是负数,就不理想,请观察输出结果。input real part

59、 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)output(=0) output+”; /虚部为正数时,在前加虚部为正数时,在前加“+”号号outputc.imagi)endl; /虚部为负数时,不加虚部为负数时,不加“+”号号return output

60、;这样,运行时输出的最后一行为这样,运行时输出的最后一行为c2=(4-10i) 。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学运算符重载中使用引用运算符重载中使用引用(reference)(reference)的重要的重要性性: :利用引用作为函数的形参可以在调用函数的过程利用引用作为函数的形参可以在调用函数的过程中通过中通过传址方式传址方式使形参成为实参的别名,因此不生使形参成为实参的别名,因此不生成临时变量成临时变量( (实参的副本实参的副本) ),减少了时间和空间的开,减少

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

62、MPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学 隐式类型转换隐式类型转换 显式类型转换显式类型转换在在C+C+中,某些不同类型数据之间可以自动转换,例如:中,某些不同类型数据之间可以自动转换,例如:intint i = 6; i = 6;i = 7.5 + i;i = 7.5 + i; intint double double doubledouble这种转换是由这种转换是由C+C+编译系统自动完成的,用户不需干预。这编译系统自动完成的,用户不需干预。这种转换称为隐式类型转换。种转换称为隐式类型转换。10.8 10.

63、8 不同类型数据间的转换不同类型数据间的转换 10.8.1 10.8.1 标准类型数据间的转换标准类型数据间的转换电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学C+C+还提供显式类型转换,程序人员在程序中指定还提供显式类型转换,程序人员在程序中指定将一种指定的数据转换成另一指定的类型,其形式将一种指定的数据转换成另一指定的类型,其形式为为 类型名类型名( (数据数据) ) 如:如:int(89.5)int(89.5); 其作用是将其作用是将89.589.5转换为整型数转换为整型数8

64、989。对于用户自己声明的类型,编译系统并不知道怎样对于用户自己声明的类型,编译系统并不知道怎样进行转换。解决这个问题的关键是让编译系统知道进行转换。解决这个问题的关键是让编译系统知道怎样去进行这些转换,需要定义专门的函数来处理怎样去进行这些转换,需要定义专门的函数来处理电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学转换构造函数转换构造函数(conversion constructor function) (conversion constructor function) 的作的作

65、用是将一个其他类型的数据转换成一个类的对象。用是将一个其他类型的数据转换成一个类的对象。先回顾一下以前学习过的几种构造函数:先回顾一下以前学习过的几种构造函数: 默认构造函数。以默认构造函数。以ComplexComplex类为例,函数原型的形式为:类为例,函数原型的形式为:Complex( );Complex( ); /没有参数没有参数用于初始化的构造函数。函数原型的形式为:用于初始化的构造函数。函数原型的形式为:Complex(double r,double i);Complex(double r,double i); /形参表列中一般有两个形参表列中一般有两个以上参数以上参数用于复制对象的

66、复制构造函数。函数原型的形式为:用于复制对象的复制构造函数。函数原型的形式为:10.8.2 10.8.2 转换构造函数转换构造函数电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学Complex (Complex &c);Complex (Complex &c); /形参是本类对象的引用形参是本类对象的引用现在又要介绍一种新的构造函数现在又要介绍一种新的构造函数转换构造函数。转换构造函数。转换构造函数只有一个形参,如转换构造函数只有一个形参,如 Complex(double r) re

67、al=Complex(double r) real=r;imagr;imag=0;=0;其作用是将其作用是将doubledouble型的参数型的参数r r转换成转换成ComplexComplex类的对象,类的对象,将将r r作作为复数的实部,虚部为为复数的实部,虚部为0 0。用户可以根据需要定义转换构造函。用户可以根据需要定义转换构造函数,在函数体中告诉编译系统怎样去进行转换。数,在函数体中告诉编译系统怎样去进行转换。 在类体中,可以有转换构造函数,也可以没有转换构造函在类体中,可以有转换构造函数,也可以没有转换构造函数,视需要而定。以上几种构造函数可以同时出现在同一个数,视需要而定。以上几种

68、构造函数可以同时出现在同一个类中,它们是构造函数的重载。编译系统会根据建立对象时类中,它们是构造函数的重载。编译系统会根据建立对象时给出的实参的个数与类型选择形参与之匹配的构造函数。给出的实参的个数与类型选择形参与之匹配的构造函数。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学使用转换构造函数将一个指定的数据转换为类对象使用转换构造函数将一个指定的数据转换为类对象的方法如下:的方法如下: 先声明一个类。先声明一个类。 在这个类中定义一个只有一个参数的构造函数,在这个类中定义一个只有

69、一个参数的构造函数,参数的类型是需要转换的类型,在函数体中指定转参数的类型是需要转换的类型,在函数体中指定转换的方法。换的方法。 在该类的作用域内可以用以下形式进行类型转在该类的作用域内可以用以下形式进行类型转换:换:类名类名( (指定类型的数据指定类型的数据) )就可以将指定类型的数据转换为此类的对象。就可以将指定类型的数据转换为此类的对象。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学不仅可以将一个标准类型数据转换成类对象,也可不仅可以将一个标准类型数据转换成类对象,也可以将另

70、一个类的对象转换成转换构造函数所在的类以将另一个类的对象转换成转换构造函数所在的类对象。如可以将一个学生类对象转换为教师类对象,对象。如可以将一个学生类对象转换为教师类对象,可以在可以在TeacherTeacher类中写出下面的转换构造函数:类中写出下面的转换构造函数: Teacher(Student& s)Teacher(Student& s)num=num=s.num;strcpy(name,s.name);sexs.num;strcpy(name,s.name);sex=s.sex;=s.sex;注意:注意: 对象对象s s中的中的num,name,sexnum,name,sex必须是必

71、须是公用成员公用成员,否则不能被类外引用。否则不能被类外引用。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学用转换构造函数可以将一个指定类型的数据转换为用转换构造函数可以将一个指定类型的数据转换为类的对象。类的对象。但是不能反过来将一个类的对象转换为但是不能反过来将一个类的对象转换为一个其他类型的数据一个其他类型的数据( (例如将一个例如将一个ComplexComplex类对象转类对象转换换成成doubledouble类型数据类型数据) )。C+C+提供类型转换函数提供类型转换函数

72、(type conversion (type conversion function)function)来解决这个问题。来解决这个问题。类型转换函数的作用类型转换函数的作用是将一个类的对象转换成另一类型的数据。如果已是将一个类的对象转换成另一类型的数据。如果已声明了一个声明了一个ComplexComplex类,可以在类,可以在ComplexComplex类中这样定类中这样定义类型转换函数:义类型转换函数: operator double( )operator double( )return real;return real;10.8.3 10.8.3 类型转换函数类型转换函数电子与信息工程系电

73、子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学类型转换函数的一般形式为类型转换函数的一般形式为 :operator operator 类型名类型名( )( ) 实现转换的语句实现转换的语句 在函数名前面不能指定函数类型,函数没有参数。在函数名前面不能指定函数类型,函数没有参数。其返回值的类型是由函数名中指定的类型名来确定其返回值的类型是由函数名中指定的类型名来确定的。的。类型转换函数只能作为成员函数类型转换函数只能作为成员函数,因为转换的主体,因为转换的主体是本类的对象。不能作为友元函数或普通函数。

74、是本类的对象。不能作为友元函数或普通函数。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学转换构造函数和类型转换运算符有一个共同的功能:转换构造函数和类型转换运算符有一个共同的功能: 当需要的时候,编译系统会自动调用这些函数,建当需要的时候,编译系统会自动调用这些函数,建立一个无名的临时对象立一个无名的临时对象( (或临时变量或临时变量) )。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网

75、 络络 教教 学学例例10.9 使用类型转换函数的简单例子。使用类型转换函数的简单例子。#include using namespace std;class Complexpublic:Complex( )real=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; /要求将一个要

76、求将一个double数据与数据与Complex类数据相加类数据相加coutdendl;return 0;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学分析:分析: (1) 如果如果在在Complex类中没有定义类型转换函数类中没有定义类型转换函数operator double,程序编译将出错。程序编译将出错。(2) 如果如果在在main函数中加一个语句:函数中加一个语句:c3=c2;由于赋值号两侧都是同一类的数据,是可以合法进行赋值由于赋值号两侧都是同一类的数据,是可以合法进行赋值

77、的,没有必要把的,没有必要把c2转换为转换为double型数据。型数据。(3) 如果在如果在Complex类中声明了重载运算符类中声明了重载运算符“+”函数作为友函数作为友元函数:元函数: Complex operator+ (Complex c1,Complex c2) /定义运算定义运算符符“+”重载函数重载函数return Complex(c1.real+c2.real, c1.imag+c2.imag);若在若在main函数中有语句函数中有语句电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网

78、络络 教教 学学c3=c1+c2;c3=c1+c2;由于已对运算符由于已对运算符“+”+”重载,使之能用于两个重载,使之能用于两个ComplexComplex类对类对象的相加,因此将象的相加,因此将c1c1和和c2c2按按ComplexComplex类对象处理,相加后类对象处理,相加后赋值给同类对象赋值给同类对象c3c3。如果改为如果改为d=c1+c2; d=c1+c2; /d/d为为doubledouble型变量型变量将将c1c1与与c2c2两个类对象相加,得到一个临时的两个类对象相加,得到一个临时的ComplexComplex类对类对象,由于它不能赋值给象,由于它不能赋值给doubledo

79、uble型变量,而又有型变量,而又有对对doubledouble的的重载函数,于是调用此函数,把临时类对象转换为重载函数,于是调用此函数,把临时类对象转换为doubledouble数据,然后赋给数据,然后赋给d d。从前面的介绍可知:从前面的介绍可知: 对类型的重载和本章开头所介绍的对对类型的重载和本章开头所介绍的对运算符的重载的概念和方法都是相似的。重载函数都使用运算符的重载的概念和方法都是相似的。重载函数都使用关键字关键字operatoroperator。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计

80、 网网 络络 教教 学学因此,通常把类型转换函数也称为类型转换运算符函数,由因此,通常把类型转换函数也称为类型转换运算符函数,由于它也是重载函数,因此也称为类型转换运算符重载函数于它也是重载函数,因此也称为类型转换运算符重载函数( (或或称强制类型转换运算符重载函数称强制类型转换运算符重载函数) )。假如程序中需要对一个假如程序中需要对一个ComplexComplex类对象和一个类对象和一个doubledouble型变量进型变量进行行+,-,*,/+,-,*,/等算术运算,以及关系运算和逻辑运算,如果不用等算术运算,以及关系运算和逻辑运算,如果不用类型转换函数,就要对多种运算符进行重载,以便能

81、进行各类型转换函数,就要对多种运算符进行重载,以便能进行各种运算。这样,是十分麻烦的,工作量较大,程序显得冗长。种运算。这样,是十分麻烦的,工作量较大,程序显得冗长。如果用类型转换函数对如果用类型转换函数对doubledouble进行重载进行重载( (使使ComplexComplex类对象转类对象转换为换为doubledouble型数据型数据) ),就不必对各种运算符进行重载,因为,就不必对各种运算符进行重载,因为ComplexComplex类对象可以被自动地转换类对象可以被自动地转换为为doubledouble型数据,而标准类型数据,而标准类型的数据的运算,是可以使用系统提供的各种运算符的。

82、型的数据的运算,是可以使用系统提供的各种运算符的。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例10.10 10.10 包含转换构造函数、运算符重载函数和类型转换包含转换构造函数、运算符重载函数和类型转换函数的程序。函数的程序。#include using namespace std;class Complexpublic:Complex( )real=0;imag=0; /默认构造函默认构造函数数Complex(double r)real=r;imag=0; /转换构造函转换

83、构造函数数Complex(double r,double i)real=r;imag=i; friend Complex operator + (Complex c1,Complex c2); void display( );private:double real;double imag;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学Complex operator + (Complex c1,Complex c2) /定义运算符定义运算符“+”重载函数重载函数return Com

84、plex(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+2.5; /复数与复数与double数据相加数据相加c3.display( );return 0;operator +(c1,2.5)相当于:相当于:operator +(c1, Complex (2.5)电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计

85、 网网 络络 教教 学学对程序的分析:对程序的分析: (1) (1) 如果没有定义转换构造函数,则此程序编译出错。如果没有定义转换构造函数,则此程序编译出错。 (2) (2) 在处理表达式在处理表达式c1+2.5c1+2.5时,编译系统把它解释为:时,编译系统把它解释为: operator+(c1,2.5)operator+(c1,2.5)由于由于2.52.5不是不是ComplexComplex类对象,系统先调用转换构造函数类对象,系统先调用转换构造函数Complex(2.5)Complex(2.5),建立一个临时的建立一个临时的ComplexComplex类对象,其值为类对象,其值为(2.5

86、+0i)(2.5+0i)。上面的函数调用相当于:上面的函数调用相当于:operator+(c1,Complex(2.5)operator+(c1,Complex(2.5)将将c1c1与与(2.5+0i) (2.5+0i) 相加,赋给相加,赋给c3c3。运行结果为:运行结果为:(5.5+4i)(5.5+4i)(3) (3) 如果把如果把“c3=c1+2.5;”c3=c1+2.5;”改为改为c3=2.5+c1; c3=2.5+c1; 程序可以通过程序可以通过编译和正常运行。过程与前相同。编译和正常运行。过程与前相同。重要结论:重要结论: 在已定义了相应的转换构造函数情况下,将运在已定义了相应的转换构造函数情况下,将运算符算符“+”+”函数重载为友元函数,在进行两个复数相加时,函数重载为友元函数,在进行两个复数相加时,可以用交换律。可以用交换律。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学作业:作业:1.1.在做完课后第在做完课后第2 2题的基础上进行适当改动或添题的基础上进行适当改动或添加函数,实现第加函数,实现第3 3题题2.2.课后第课后第6 6题题

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号