cchap运算符重载实用教案

上传人:夏** 文档编号:569866427 上传时间:2024-07-31 格式:PPT 页数:67 大小:1.20MB
返回 下载 相关 举报
cchap运算符重载实用教案_第1页
第1页 / 共67页
cchap运算符重载实用教案_第2页
第2页 / 共67页
cchap运算符重载实用教案_第3页
第3页 / 共67页
cchap运算符重载实用教案_第4页
第4页 / 共67页
cchap运算符重载实用教案_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《cchap运算符重载实用教案》由会员分享,可在线阅读,更多相关《cchap运算符重载实用教案(67页珍藏版)》请在金锄头文库上搜索。

1、0. 操作符重载(zhn zi)的需要性 C+语言本身没有提供复数类型,可定义一个(y)类来实现:classComplex/复数类定义public:Complex(doubler=0.0,doublei=0.0)real=r;imag=i;voiddisplay()constcoutreal+imagi;.private:doublereal;doubleimag;如何实现两个复数(类型为Complex)相加?第1页/共66页第一页,共67页。一种方案:为Complex类定义一个成员函数(hnsh)add,例如:classComplexpublic:Complexadd(constComple

2、x&x)constComplextemp;temp.real=real+x.real;temp.imag=imag+x.imag;returntemp;Complexa(1.0,2.0),b(3.0,4.0),c;c=a.add(b);第2页/共66页第二页,共67页。另一种方案:定义一个友元函数,例如(lr):classComplex/复数类定义.friendComplexcomplex_add(constComplex&x1,constComplex&x2);Complexcomplex_add(constComplex&x1,constComplex&x2)Complextemp;tem

3、p.real=x1.real+x2.real;temp.imag=x1.imag+x2.imag;returntemp;Complexa(1.0,2.0),b(3.0,4.0),c;c=complex_add(a,b);第3页/共66页第三页,共67页。在前面的两种实现中,针对复数的加法操作,其形式不符合数学上的习惯:c=a+b,如何将其以数学的书写形式实现复数相加,这时就出现了运算符重载的概念(ginin)c+具备这一功能,可以解决这个问题第4页/共66页第四页,共67页。1.什么(shnme)是运算符重载运算符重载(zhnzi)的含义是:对已有的运算符进行重新定义,使它具有新的功能,即就是

4、用同一个运算符完成不同的运算操作。例如:用“+”运算符完成两个实数、两个复数、两个字符串的相关运算。5第5页/共66页第五页,共67页。1.什么(shnme)是运算符重载6实数实数 设:设:c1=10 c1=10 ,c2=20c2=20,则:,则:c1+c2=10+20=30c1+c2=10+20=30复数复数 设:设:c1=10+10ic1=10+10i,c2=20+20ic2=20+20i,则:,则:c1+c2=30+30i c1+c2=30+30i 字符串字符串 设:设:c1=“ABCD”c1=“ABCD”,c2=“EFGH” c2=“EFGH” ,则,则c1+c2=ABCDEFGH ”

5、c1+c2=ABCDEFGH ” 这就是这就是(jish)“+”(jish)“+”运算符的重载。运算符的重载。第6页/共66页第六页,共67页。2.运算符重载(zhnzi)的方法为了重载运算符,必须定义一个函数,并告诉编译器,遇到这个重载运算符就调用该函数,由这个函数来完成该运算符应该完成的操作。这种函数称为(chn wi)运算符重载函数,它通常是类的成员函数或者是友元函数。运算符的操作数通常也应该是类的对象。7第7页/共66页第七页,共67页。2.运算符重载(zhnzi)的方法重载运算符的函数一般(ybn)形式:函数类型operator运算符名称(形参表)函数体(对运算符的重载处理)8第8页

6、/共66页第八页,共67页。3.重载(zhnzi)运算符的规则不允许用户定义新的运算符,只能对c+已有的运算符进行重载C+允许重载的运算符见表10.1(P313),不能重载的运算符有5个,见下页的表重载不能改变运算符运算对象(操作数)的个数重载不能改变运算符的优先级、结合(jih)性重载运算符的函数不能有默认的参数(见书P313-314)9第9页/共66页第九页,共67页。3.重载(zhnzi)运算符的规则10C+C+中不允许中不允许(ynx)(ynx)重载的运算符重载的运算符运算符运算符 运算符的含义运算符的含义不允许重载的原因不允许重载的原因?:?:三目运算符三目运算符 在在C+中没有定义

7、一个三目运算符的语法中没有定义一个三目运算符的语法 成员操作符成员操作符保证成员操作符对成员访问的安全性,故不保证成员操作符对成员访问的安全性,故不允许重载允许重载*成员指针操作符成员指针操作符同上同上:作用域运算符作用域运算符因该操作符左边的操作数是类名,而不是一因该操作符左边的操作数是类名,而不是一个表达式个表达式sizeof 求字节数操作符求字节数操作符其操作数可能是一个类型名,而不是一个表其操作数可能是一个类型名,而不是一个表达式达式第10页/共66页第十页,共67页。4.运算符重载(zhnzi)函数作为类成员函数和友元函数11运算符重载的函数有两种方式:把运算符重载的函数作为(zuw

8、i)类的成员函数把运算符重载函数作为(zuwi)类的友元函数第11页/共66页第十一页,共67页。4.运算符重载函数作为(zuwi)类成员函数和友元函数12(1)运算符重载函数(hnsh)作为类成员函数(hnsh)定义格式如下:operator()函数(hnsh)体运算(ynsun)的对象关键字Aoperator+(A&);/重载了类A的“+”运算符返回类型函数名运算的对象其中:operator是定义运算符重载函数的关键字,它与其后的运算符一起构成函数名。第12页/共66页第十二页,共67页。4.运算符重载函数(hnsh)作为类成员函数(hnsh)和友元函数(hnsh)调用格式: .(实参表)

9、 );例如: 在进行(jnxng)(jnxng)两个对象的二元运算时,其程序中所用到语法格式为: ; 如:c1+c2c1+c2 而执行上述语句时,系统将自动转换成对重载函数的调用格式: c1.operator+(c2); c1.operator+(c2);13第13页/共66页第十三页,共67页。14class A private: int i; public: A(int a=0) i=a; void Show( ) couti=iendl;A operator +(A &a)/定义重载运算符+的成员函数(hnsh) A t; t.i=i+a.i; return t; ;void main(

10、 ) A a1(10),a2(20),a3;a1.Show ();a2.Show ();a3=a1+a2;/重新解释了加法,可以直接进行类的运算a3.Show ();使用使用(shyng)重载运算符的重载运算符的例子例子运行运行(ynxng)结结果:?果:?i=10i=20i=30相当于a3=a1.operator+(a2)即:左操作数作为调用重载函数的对象,右操作数作为调用重载函数的实参。i的值是实参a1.i,即为10;虚参a接收实参a2的值,所以a.i=20第14页/共66页第十四页,共67页。15class A private:int i;public:A(int a=0) i=a; v

11、oid Show(void) couti=iendl;void AddA(A &a,A &b)/利用(lyng)函数进行类之间的运算i=a.i+b.i;void main(void) A a1(10),a2(20),a3;a1.Show ();a2.Show ();/ a3=a1+a2;/不可直接运算a3.AddA(a1,a2);/调用专门的功能函数a3.Show ();没有(mi yu)重载运算符的例子利用函数完成了加法(jif)运算第15页/共66页第十五页,共67页。重载运算符与一般函数的比较:相同:1)均为类的成员函数;2)实现同一(tngy)功能void AddA( A &a, A

12、&b )void AddA( A &a, A &b ) i=a.i+b.i; i=a.i+b.i; 函数调用:a3.AddA(a1,a2);a3.AddA(a1,a2);返回值函数(hnsh)名由对象(duxing)a3调用A operator +(A &a)A operator +(A &a) A t; A t; t.i=i+a.i; t.i=i+a.i; return t; return t; 函数调用:a3=a1+a2;a3=a1.operator+(a2);形参列表返回值函数名由对象a1调用形参:是对象的引用第16页/共66页第十六页,共67页。#includeclass Room p

13、rivate: double Length, Wide; public: Room(double a=0.0, double b=0.0) Length=a; Wide=b; void Show(void) coutLength=LengthtWide=Wideendl; Room operator+(Room &);/重载运算符重载运算符+,函数原型,函数原型(yunxng);Room Room:operator + (Room &r) /重载运算符,函数定义重载运算符,函数定义 Room rr; rr.Length =Length+r.Length; rr.Wide =Wide+r.Wid

14、e ; return rr;void main(void) Room r1(3,2),r2(1,4), r3,r4;r1.Show ();r2.Show ();r3=r1+r2; r3.Show ();r4=r1+r2+r3;r4.Show ();相当于r3=r1.operator+(r2 );第17页/共66页第十七页,共67页。(1)18运算符的优先级和结合律是不能改变(gibin)的第18页/共66页第十八页,共67页。#includeclass Complex public:Complex()real=0;imag=0; Complex(double r,double i) real=

15、r;imag=i; Complex operator+(Complex &c2) Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; void display() cout(real,imagi)endl;private:double real;double imag;使用运算符重载实现使用运算符重载实现(shxin)复复数加运算数加运算第19页/共66页第十九页,共67页。int main() Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; cout“c1=”;c1.display();

16、 cout“c2=”;c2.display(); cout“c3=”;c3.display();相当于c3=c1.operator+(c2 )第20页/共66页第二十页,共67页。例、实现(shxin)复数的“等于”操作。classComplexdoublereal,imag;public:.booloperator=(constComplex&x)constreturn(real=x.real)&(imag=x.imag);.Complexc1,c2;.if(c1=c2).第21页/共66页第二十一页,共67页。4.运算符重载函数(hnsh)作为类成员函数(hnsh)和友元函数(hnsh)(

17、2)运算符重载函数作为类的友元函数友元函数是在类外的普通函数,与一般函数的区别是可以调用类中的私有或保护(boh)数据。将运算符的重载函数定义为友元函数时,参与运算的对象全部要成为函数参数。22第22页/共66页第二十二页,共67页。4.运算符重载(zhnzi)函数作为类成员函数和友元函数运算符重载函数作为类友元函数的定义格式:说明:形参1与形参2为参加运算的两个对象的引用。当重载函数为友元普通函数时,该重载函数不能用对象调用,因此参加运算的两个对象必须以参数的方式传送(chunsn)到重载函数体内,所以形参通常为两个参加运算的对象引用。23 (形参1 1,形参2) 2) 函数体 第23页/共

18、66页第二十三页,共67页。4.运算符重载(zhnzi)函数作为类成员函数和友元函数例如:Aa,b,c;c=a+b;实际上是c=operator+(a,b);c=+a;实际上是c=operator+(a);c+=a;实际上是operator+=(c,a);说明:参加运算的操作数均作为函数的参数(cnsh)(红色字体表示)24第24页/共66页第二十四页,共67页。4.运算符重载函数作为(zuwi)类成员函数和友元函数例10.3:将运算符“+”重载为适用于复数的加法,重载函数(hnsh)放在类外,作为类的友元函数(hnsh)。代码如下:25第25页/共66页第二十五页,共67页。#include

19、 class Complex public: 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; ;第26页/共66页第二十六页,共67页。Complex operator+ (Complex &c1,Complex &c2) return Comp

20、lex(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(); coutc1+c2=; c3.display(); return 0; 相当于c3=operator+(c1,c2 )第27页/共66页第二十七页,共67页。5.重载(zhnzi)双目运算符双目运算是指有两个操作数的运算,操作数在运算符的两

21、侧,前面(qinmian)举的实例都是双目运算。双目运算符既可以重载为成员函数,也可以重载为类的友元函数。28第28页/共66页第二十八页,共67页。5.重载(zhnzi)双目运算符双目运算重载(zhnzi)为成员函数的定义格式class.operator#();/#代表可重载(zhnzi)的操作符;:operator#().使用格式a;b;a#b或,a.operator#(b)29第29页/共66页第二十九页,共67页。5.重载(zhnzi)双目运算符双目运算重载为友元函数的定义(dngy)格式operator#(,).使用格式为:a;b;a#b或operator#(a,b)30第30页/共

22、66页第三十页,共67页。5.重载(zhnzi)双目运算符例10.4:定义一个(y)字符串类String,用来存放不定长度的字符串,重载运算符“=”,“”,用于两个字符串的等于,小于和大于的比较运算。注:从简单到最终完成,可分以下几个步骤31第31页/共66页第三十一页,共67页。#include class String /String 是用户(yngh)自己指定的类名 public: String()p=NULL; String(char *str); void display(); private: char *p; ; String:String(char *str) p=str;vo

23、id String:display() coutp; int main() String string1(“Hello”); String string2(Book); string1.display(); coutendl; string2.display(); return 0;第1步:创建类String,编写(binxi)简单程序框架第32页/共66页第三十二页,共67页。#include #include class String public: String()p=NULL; String(char *str); friend bool operator(String &string

24、1,String &string2); void display(); private: char *p; ;第2步:增加(zngji)运算符重载部分,先增加(zngji)重载运算符“”第33页/共66页第三十三页,共67页。 String:String(char *str) p=str; void String:display() cout(String &string1,String &string2) if(strcmp(string1.p,string2.p)0) return true; else return false; int main() String string1(Hel

25、lo),string2(Book); coutstring2)(string1, string2 )第34页/共66页第三十四页,共67页。#include #include class String public: 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 &

26、string2); void display(); private: char *p; ;第3步:扩展(kuzhn)到3个运算符重载第35页/共66页第三十五页,共67页。String:String(char *str) p=str;void String:display() cout(String &string1,String &string2) if( strcmp(string1.p,string2.p)0 ) return true; else return false; bool operator(String &string1,String &string2) if( strcm

27、p(string1.p,string2.p)0 ) return true; else return false; 第36页/共66页第三十六页,共67页。bool operator=(String &string1,String &string2) if( strcmp(string1.p,string2.p)=0 ) return true; else return false; int main()String string1(Hello),string2(Book),string3(Computer); coutstring2)endl; cout(string1string3)end

28、l; cout(string1=string2)endl; return 0;相当于:operator(string1, string2 )operator=(string1, string2 )第37页/共66页第三十七页,共67页。5.重载(zhnzi)双目运算符第4步:进一步修饰、完善(wnshn),使其更直观,详细代码见:P321P32238第38页/共66页第三十八页,共67页。6.重载(zhnzi)单目运算符39单目运算是指:只有一个操作数的运算,所以也称一元运算。如,!a,+i,j-等等。单目运算符既可以重载为成员(chngyun)函数,也可以重载为类的友元函数。第39页/共66

29、页第三十九页,共67页。6.重载(zhnzi)单目运算符40单目运算符重载为成员函数的定义格式:class.operator#();:operator#().使用格式:a;#a或,a.operator#()第40页/共66页第四十页,共67页。6.重载(zhnzi)单目运算符41单目运算符重载为友元函数的定义格式:定义格式operator#().使用格式为:a;#a或operator#(a)第41页/共66页第四十一页,共67页。例:实现(shxin)复数的取反操作classComplex .public:.Complexoperator-()constComplextemp;temp.rea

30、l=-real;temp.imag=-imag;returntemp;.Complexa(1,2),b;b=-a;/把b修改(xigi)成a的负数。第42页/共66页第四十二页,共67页。6.重载(zhnzi)单目运算符43典型单目运算符为“+” “+” 或(- - -),它们(t (t men)men)分别有前置与后置两种,如果没有特殊说明,它们(t men)(t men)的前置用法与后置用法均使用同一个重载函数:operator +();operator +();为了能够区分+(- - -)的前置与后置用法,可为它们(t men)(t men)再写一个重载函数用于实现它们(t men)(t

31、 men)的后置用法,该重载函数应有一个形式上的intint型参数:operator +(int);operator +(int);第43页/共66页第四十三页,共67页。6.重载(zhnzi)单目运算符44以以+运算为例,重载函数定义运算为例,重载函数定义(dngy)(dngy):“+”“+”为前置运算符,定义为前置运算符,定义(dngy)(dngy)格式:格式: :operator +( ) :operator +( ) 函数体函数体 “+” “+”为后置运算符,定义为后置运算符,定义(dngy)(dngy)格式:格式: :operator +( int ):operator +( int

32、 )函数体函数体 重载函数的调用格式:重载函数的调用格式: 前置前置“+”“+”运算符,调用格式:运算符,调用格式: .operator +( ).operator +( ); 后置后置“+”“+”运算符,调用格式:运算符,调用格式: .operator +(1).operator +(1);用来区分是前置还是后置运算,没有(mi yu)实际意义。详细内容自学第44页/共66页第四十四页,共67页。classCounter intvalue;public:Counter()value=0; Counter&operator+()/前置的+重载函数 value+;return*this; con

33、stCounteroperator+(int)/后置的+重载函数 Countertemp=*this;/保存原来的对象+(*this);/调用前置的+重载函数,或直接写成value+;returntemp;/返回原来的对象;.Countera,b,c;b=+a;/使用的是上述类定义(dngy)中不带参数的操作符+重载函数c=a+;/使用的是上述类定义(dngy)中带int型参数操作符+重载函数第45页/共66页第四十五页,共67页。6.重载(zhnzi)单目运算符46以前置+为例,例10.5:有一个Time类,包含2个数据成员:minute(分)和sec(秒),模拟秒表,每次走1秒,满60秒进

34、1分钟,此时(csh)秒又从0算起,要求输出分和秒的值。注意:使用+前置运算符完成第46页/共66页第四十六页,共67页。#include using namespace std;class Timepublic: Time()minute=0;sec=0;/默认构造函数 Time(int m,int s) minute=m;sec=s;/构造函数重载 Time operator+( ); /声明运算符重载成员函数 void display()/定义输出(shch)时间函数 coutminute:sec=60) sec=sec-60; +minute; return *this;/返回自加后的

35、当前(dngqin)对象int main()Time time1(34,0); for (int i=0;i61;i+) +time1; time1.display(); return 0;第48页/共66页第四十八页,共67页。如果改变显示方式(fngsh)为类似秒表方式(fngsh),可以在主函数增加一条语句,即改为:for (int i=0;i61;i+) system(“cls”);/清屏 +time1; time1.display(); 第49页/共66页第四十九页,共67页。#include using namespace std;class Timepublic: Time()m

36、inute=0;sec=0; Time(int m,int s)minute=m;sec=s; Time operator+(); void display()coutminute:sec=60) sec-=60; +minute; return *this; int main()Time time1(34,0); for (int i=0;i61;i+)system(cls); +time1; time1.display(); return 0;第51页/共66页第五十一页,共67页。52总结(zngji):对二元运算符,重载为成员函数时,仅一个参数(cnsh)(cnsh),另一个被隐含;重

37、载为友元函数时,有两个参数(cnsh)(cnsh),没有隐含参数(cnsh)(cnsh)。一般来说,一元运算符最好被重载为成员函数, ,对二元运算符最好被重载为友元函数。第52页/共66页第五十二页,共67页。假定要对类AB定义减号操作符重载成员(chngyun)函数,实现两个AB类对象的减法,并返回相减结果,则该成员(chngyun)函数的声明语句为()A)ABoperator-(AB&a,AB&b);B)ABoperator-(AB&a);C)operator-(ABa);D)AB&operator-();53练习(linx)B第53页/共66页第五十三页,共67页。7.重载(zhnzi)

38、流插入运算符”C+编译系统在其类库中提供了iostream类,该类由包括:输入流类istream和输出流类ostream,而cin和cout分别是istream类和ostream类的对象,所以,如果在程序中使用(shyng)”cout”,则必须在程序的开始添加头文件”iostream.h”。54第54页/共66页第五十四页,共67页。C+编译系统已经对”进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C+标准类型(lixng)的数据。用户自己定义的类型(lixng)的数据(如对象),是不能直接用”来输出和输入的,如果想用它们输出和输入自己声明的类型(lixng)的数据,必须对它

39、们重载。输入输出运算符只能用友元函数重载557.重载(zhnzi)流插入运算符”第55页/共66页第五十五页,共67页。对”重载的函数形式如下:istream&operator(istream&,自定义(dngy)类&);ostream&operator(ostream&,自定义(dngy)类&);所以,只能将重载”的函数作为友元函数,不能将它们定义(dngy)为成员函数。56第1个参数和函数的类型必须(bx)是istream&(即istream类对象的引用)第2个参数(cnsh)是要进行输入操作的类7.重载流插入运算符”第56页/共66页第五十六页,共67页。(1)重载流插入运算符”例10.

40、7:在例10.2基础( jch)上,用重载的运算符”输出复数577.重载流插入(ch r)运算符”第57页/共66页第五十七页,共67页。#include class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex operator+(Complex &c2); friend ostream& operator (ostream&,Complex&); private: double real; double imag; ;Complex Complex:opera

41、tor+(Complex &c2) return Complex(real+c2.real,imag+c2.imag);第58页/共66页第五十八页,共67页。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;相当于:c3=c1.operator+(c2 )相当于:operator”例10.8:在例10.7基础上,增加重载(zhnzi)流

42、提取运算符”,用”cin”输入复数,用”cout”输出复数607.重载(zhnzi)流插入运算符”第60页/共66页第六十页,共67页。#include class Complex public: friend ostream& operator(istream&,Complex&); private: double real; double imag; ; ostream& operator(ostream& output,Complex& c) output(=0) output+; outputc.imag(istream& input,Complex& c) coutc.realc.i

43、mag; return input;int main()Complex c1,c2; cinc1c2; coutc1=c1endl; coutc2=c2(cin,c1 )和operator(cin,c2 ),2次调用(dioyng)相当于:operator(cout,c1 )相当于:operator(cout,c2 )第62页/共66页第六十二页,共67页。第63页/共66页第六十三页,共67页。8.10.8有关运算符重载归纳(自学)10.9不同类型数据(shj)间的转换(自学)64第64页/共66页第六十四页,共67页。作业(zuy)看书(knsh)第10章相关知识内容复习PPT内容65第65页/共66页第六十五页,共67页。66感谢您的观赏(gunshng)!第66页/共66页第六十六页,共67页。内容(nirng)总结0. 操作符重载的需要性。用“+”运算符完成两个实数、两个复数、两个字符串的相关运算。其操作数可能是一个(y )类型名,而不是一个(y )表达式。void main(void)。void Show(void)。void main(void)。Complex(double r)real=r。第3步:扩展到3个运算符重载。单目运算是指:只有一个(y )操作数的运算,所以也称一元运算。 sec=sec-60。第65页/共66页。感谢您的观赏第六十七页,共67页。

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

最新文档


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

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