运算符重载和类型转换精.ppt
《运算符重载和类型转换精.ppt》由会员分享,可在线阅读,更多相关《运算符重载和类型转换精.ppt(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、运算符重载和类型转换运算符重载和类型转换第1页,本讲稿共34页主要内容主要内容n n运算符重载的目的运算符重载的目的n n运算符重载概述运算符重载概述n n重载的规则和限制n n如何重载运算符如何重载运算符n n常见运算符的重载常见运算符的重载n n类型转换类型转换n n小结小结第2页,本讲稿共34页class Complexclass Complex public:public:Complex(float r=0,float i=0)real=r;image=i;Complex(float r=0,float i=0)real=r;image=i;Complex add(const Comp
2、ex&c)Complex add(const Compex&c)return Complex(real+c.real,image+c.image);return Complex(real+c.real,image+c.image);private:private:float real,image;float real,image;void main()void main()int i=29,j=870,k;int i=29,j=870,k;float x=2.6,y=2.4;float x=2.6,y=2.4;k=i+j;k=i+j;float z=x+y;float z=x+y;Comple
3、x c1(3.2,4.6),c2(6.2,8.7),c3;Complex c1(3.2,4.6),c2(6.2,8.7),c3;c3=c1.add(c2);c3=c1.add(c2);第3页,本讲稿共34页运算符重载概述运算符重载概述n n运算符运算符运算符运算符是一些系统预定义的函数名称,即用一些特定的符号是一些系统预定义的函数名称,即用一些特定的符号表示各种运算。每个运算符对运算数据都有一定要求。表示各种运算。每个运算符对运算数据都有一定要求。n n C+C+中预定义的运算符的操作对象中预定义的运算符的操作对象只能是基本数据类型只能是基本数据类型只能是基本数据类型只能是基本数据类型,实,实
4、际上,对于很多用户自定义类型,也需要有类似的运算操作,际上,对于很多用户自定义类型,也需要有类似的运算操作,这就提出了对运算符进行重新定义,赋予已有符号以新功能这就提出了对运算符进行重新定义,赋予已有符号以新功能的要求。的要求。n n运算符重载运算符重载运算符重载运算符重载是对已有的运算符赋予多重含义,同一个运算符是对已有的运算符赋予多重含义,同一个运算符作用于不同类型的数据导致不同类型的行为。作用于不同类型的数据导致不同类型的行为。n n运算符重载的运算符重载的实质就是函数重载实质就是函数重载实质就是函数重载实质就是函数重载。在实现过程中,首先把指。在实现过程中,首先把指定的运算表达式转化为
5、对运算符函数的调用,运算对象转化定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。的函数,这个过程是在编译过程中完成的。第4页,本讲稿共34页运算符重载的规则和限制运算符重载的规则和限制n n不可以重载的运算符有:不可以重载的运算符有:.*:?:sizeof.*:?:sizeofn n只能重载只能重载C+C+语言中已有的运算符,不可臆造新的。语言中已有的运算符,不可臆造新的。n n运算符重载后优先级和结合性都不会改变,运算符重载后优先级和结合性都不会改
6、变,n n不能改变操作数个数不能改变操作数个数,单目只能重载为单目运算符,双目只能重载为双目运算符单目只能重载为单目运算符,双目只能重载为双目运算符n n不能改变运算符对预定义类型数据的操作方式,即重载运算符时,其操作数中至少应该有一个不能改变运算符对预定义类型数据的操作方式,即重载运算符时,其操作数中至少应该有一个是自定义类型。是自定义类型。n n重载的运算符应保持其原有的基本语义。重载的运算符应保持其原有的基本语义。n nC+C+规定:规定:=-()=-()只能重载为成员函数形式:只能重载为成员函数形式:n n 作为提取和插入运算符使用时,只能用友元函数重载作为提取和插入运算符使用时,只能
7、用友元函数重载第5页,本讲稿共34页运算符函数运算符函数n n定义运算符重载函数的一般格式:定义运算符重载函数的一般格式:operator operator ()././函数体函数体 n ntypetype为函数返回值的类型;为函数返回值的类型;为要重载的运算符;为要重载的运算符;argarg为函数的形参表,为函数的形参表,operatoroperator是关键是关键字,它与其后的运算符一起构成函数名。字,它与其后的运算符一起构成函数名。n n为了提高访问效率,运算符重载函数通常需要直接访问对象的私有或保护的数据成员,因此为了提高访问效率,运算符重载函数通常需要直接访问对象的私有或保护的数据成
8、员,因此运算符重载函数通常为运算符重载函数通常为类的成员函数类的成员函数或者或者友元函数友元函数。第6页,本讲稿共34页重载为类的成员函数重载为类的成员函数重载为类的成员函数重载为类的成员函数n n双目运算符双目运算符双目运算符双目运算符 B B 如果要重载如果要重载 B B 为类的成员函数,使之能够实现表达式为类的成员函数,使之能够实现表达式 oprd1 oprd1 B oprd2B oprd2,其中,其中 oprd1oprd1 为为A A 类对象,则类对象,则 B B 应被重载为应被重载为 A A 类的类的成员函数,形参类型应该是成员函数,形参类型应该是 oprd2oprd2 所属的类型。
9、所属的类型。经重载后,经重载后,oprd1 B oprd2oprd1 B oprd2 相当于相当于 oprd1.operator B(oprd2)oprd1.operator B(oprd2)n n前置单目运算符前置单目运算符前置单目运算符前置单目运算符 UU 如果要重载如果要重载 U U 为类成员函数,使之能够实现表达式为类成员函数,使之能够实现表达式 U oprdU oprd,其中,其中 oprdoprd 为为A A类对象,则类对象,则 U U 应被重载为应被重载为 A A 类的成员函数,类的成员函数,无形参。经重载后,表达式无形参。经重载后,表达式 U oprdU oprd 相当于相当于
10、 oprd.operator Uoprd.operator U()()第7页,本讲稿共34页n n后置运算符后置运算符后置运算符后置运算符“+”+”和和和和“”如果要实现表达式如果要实现表达式如果要实现表达式如果要实现表达式oprd+oprd+或或或或oprd oprd ,其中,其中,其中,其中oprdoprd为为为为A A 类类类类对象,那么运算符重载函数中要带一个整型对象,那么运算符重载函数中要带一个整型对象,那么运算符重载函数中要带一个整型对象,那么运算符重载函数中要带一个整型(int)(int)形参。形参。形参。形参。经经经经重载后,重载后,重载后,重载后,oprd+oprd+相当于相
11、当于相当于相当于 oprd.operator+(0)oprd.operator+(0)oprd oprd 相当于相当于相当于相当于 oprd.operator oprd.operator (0)(0)n n前增量与后增量的区别前增量与后增量的区别前增量与后增量的区别前增量与后增量的区别 使用前增量时,对对象(操作数)进行增量修改,然后使用前增量时,对对象(操作数)进行增量修改,然后使用前增量时,对对象(操作数)进行增量修改,然后使用前增量时,对对象(操作数)进行增量修改,然后再返回该对象,参数与返回的是同一个对象再返回该对象,参数与返回的是同一个对象再返回该对象,参数与返回的是同一个对象再返回
12、该对象,参数与返回的是同一个对象 使用后增量时,必须在增量之前返回原有的对象。后增量使用后增量时,必须在增量之前返回原有的对象。后增量使用后增量时,必须在增量之前返回原有的对象。后增量使用后增量时,必须在增量之前返回原有的对象。后增量操作返回的是原有对象值,不是原有对象,原有对象已经操作返回的是原有对象值,不是原有对象,原有对象已经操作返回的是原有对象值,不是原有对象,原有对象已经操作返回的是原有对象值,不是原有对象,原有对象已经被增量修改。被增量修改。被增量修改。被增量修改。第8页,本讲稿共34页重载为类的友元函数重载为类的友元函数重载为类的友元函数重载为类的友元函数n n此时运算所需的操作
13、数都是通过函数的参数表来传递,在参数表中形参从左此时运算所需的操作数都是通过函数的参数表来传递,在参数表中形参从左到右的顺序就是运算符操作数的顺序。到右的顺序就是运算符操作数的顺序。n n双目运算符双目运算符 B B重载后,重载后,(ch18_2ch18_2)表达式表达式oprd1 B oprd2oprd1 B oprd2 等同于等同于operator B(oprd1,oprd2)operator B(oprd1,oprd2)n n前置单目运算符前置单目运算符 B B重载后,重载后,B oprd B oprd 等同于等同于 operator B(oprd)operator B(oprd)n n
14、后置单目运算符后置单目运算符 +和和-重载后,此时函数的形参有两个,一个是类的对象,重载后,此时函数的形参有两个,一个是类的对象,另一个是整型另一个是整型(int)(int)形参形参 oprd B oprd B 等同于等同于 operator B(oprd,0)operator B(oprd,0)第9页,本讲稿共34页两种重载形式的比较两种重载形式的比较n n对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函数带有两个参数;对单目运算符而言,成员运算符函数不带参数,而数带有两个参数;对单目运算符而言,成员运算符函数不带参数,
15、而友元运算符函数带有一个参数友元运算符函数带有一个参数 。n n双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但有一种情况必须使用友元函数,如加法运算。有一种情况必须使用友元函数,如加法运算。n n运算符函数调用形式运算符函数调用形式习惯形式习惯形式习惯形式习惯形式友元调用形式友元调用形式友元调用形式友元调用形式成员调用形式成员调用形式成员调用形式成员调用形式a+ba+boperator+(a,b)operator+(a,b)a.operator+(b)a.operator+(b)-a-aoperator-(a)opera
16、tor-(a)a.operator-()a.operator-()a+a+operator+(a,0)operator+(a,0)a.operator+(0)a.operator+(0)第10页,本讲稿共34页成员与友元运算符函数选取经验成员与友元运算符函数选取经验成员与友元运算符函数选取经验成员与友元运算符函数选取经验n n对于对于单目运算符,建议选择成员函数单目运算符,建议选择成员函数。n n对于运算符对于运算符“=()()-”-”只能作为成员函数只能作为成员函数。n n对于运算符对于运算符“+=-=/=*=&=!=%=-。确保指向类对象的指针总是指向某个有意义的对象(有效内存地址),即创
17、建一个确保指向类对象的指针总是指向某个有意义的对象(有效内存地址),即创建一个指向对象的指向对象的“智能指针智能指针”(smart pointersmart pointer),否则就返回错误信息。这样避免了),否则就返回错误信息。这样避免了对空指针或垃圾指针对空指针或垃圾指针(garbage pointer)(garbage pointer)内容的存取。由于右操作数是对象的成员,内容的存取。由于右操作数是对象的成员,该成员类型不能确定,所以该成员类型不能确定,所以 -只能作为一元运算符重载。只能作为一元运算符重载。n n重载下标运算符重载下标运算符 ,可增加数组检索的安全性,可增加数组检索的安
18、全性。n n重载函数调用运算符(),是唯一可带多个右操作数的运算符函数。重载函数调用运算符(),是唯一可带多个右操作数的运算符函数。第12页,本讲稿共34页重载重载=运算符解决指针悬挂运算符解决指针悬挂n nn nClass stringClass stringn nPublic:Public:n nString(char*s)String(char*s)n nPtr=new charstrlen(s)+1;Strcpy(ptr,s);Ptr=new charstrlen(s)+1;Strcpy(ptr,s);n nstring()Delete ptr;string()Delete ptr;n
19、 nVoid print()coutptrendl;Void print()coutptrendl;n nString&operator=(const string&);String&operator=(const string&);n nPrivate:Private:n nChar*ptr;Char*ptr;n n;n nString&string:operator=(const string&s)String&string:operator=(const string&s)n n If(this=&s)return*this;If(this=&s)return*this;n n Dele
20、te ptr;Delete ptr;n n Ptr=new charstrlen(s.ptr)+1;Ptr=new charstrlen(s.ptr)+1;n n strcpy(ptr,s.ptr);strcpy(ptr,s.ptr);n n Return*this;Return*this;n n Void main()String p1(“book”);String p2(“pen”);P1=p2;Cout“p2:”;P1.print();第13页,本讲稿共34页重载重载重载重载new new 和和和和deletedeleten nn nClass RectClass Rectn n n n
21、Public:Public:n nRect(int l,int w)Length=1;width=w;Rect(int l,int w)Length=1;width=w;n nVoid disp(0Void disp(0n n Cout“length*widthendl;Cout“length*widthendl;n nVoid*Rect:operator new(size_t size)Void*Rect:operator new(size_t size)n n n nCout“reload new“endl;Cout“reload new“endl;n nRetrun molloc(siz
22、e);Retrun molloc(size);n n n nVoid Rect:operator delete(void*p)Void Rect:operator delete(void*p)n n n nCout“reload delete free”endl;Cout“reload delete free”disp();Delete p;第14页,本讲稿共34页重载重载n n ostream&operator(ostream&ostream&operator(ostream&out,class_name&obj)out,class_name&obj)n n n noutobj.item1;
23、outobj.item1;n n;n nOutobj.item2;Out(istream&in,class_name&Istream&operator(istream&in,class_name&obj)obj)n n n nInobj.item1;Inobj.item1;n nInobj.item2;Inobj.item2;n nn nReturn in;Return in;第15页,本讲稿共34页n nClass coordClass coordInt x,y;Int x,y;Public:Public:Coord(int i=0,int j=0)Coord(int i=0,int j=0
24、)X=I;y=j;X=I;y=j;Friend ostream&operator(ostream&stream,coord&ob)Friend ostream&operator(ostream&stream,coord&ob)Stream0b.x“,”ob.yendl;Stream0b.x“,”ob.yendl;Return stream;Return stream;Main()Main()Coord a(55,66),b(100,200);Coord a(55,66),b(100,200);Coutab;Coutab;Return 0;Return 0;第16页,本讲稿共34页n nn nC
25、lass three_dClass three_dn nPublic:Public:n nTrhrr_d(int a,int b,int c)Trhrr_d(int a,int b,int c)n nX=a;y=b;z=c;X=a;y=b;z=c;n nFriend ostream&operator(ostreams&ouput,three_d&ob);Friend ostream&operator(istream&itput,three_d&ob);Friend istream&operator(istream&itput,three_d&ob);n nPrivate:Private:n n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 重载 类型 转换
限制150内