第8章运算符重载精选PPT.ppt
《第8章运算符重载精选PPT.ppt》由会员分享,可在线阅读,更多相关《第8章运算符重载精选PPT.ppt(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第8章运算符重载章运算符重载第1页,本讲稿共50页目 录81 运算符重载概述运算符重载概述82 单目运算符重载单目运算符重载83 双目运算符重载双目运算符重载84 比较运算符重载比较运算符重载85 赋值运算符重载赋值运算符重载86 下标运算符重载下标运算符重载87 运算符运算符new与与delete重载重载(自学)(自学)88 逗号运算符重载逗号运算符重载(自学)(自学)89 类型转换运算符重载类型转换运算符重载810 运算符重载应用实例运算符重载应用实例第2页,本讲稿共50页问题引入:#include class complexprivate:double real;double imag
2、;public:complex(double r=0.0,double i=0.0)real=r;imag=i;void display()coutreal“+”image“i”endl;void main()int ia1,ib=2,ic;ic=ia+ib;complex a(10,20),b(5,8),c;c=a+b?C+C+预定义的运算符的操作对象只能是基本数据类型,那么用预定义的运算符的操作对象只能是基本数据类型,那么用户自定义类型呢?户自定义类型呢?运算符重载运算符重载!第3页,本讲稿共50页8.1 运算符重载概述运算符重载概述背景背景c+中预定义的运算符的操作对象只能是基本数据类型
3、,而用户自定义类型(比如类)也需要有类似的运算操作能否对运算符重新定义,赋予已有符号以新的功能?运算符重载运算符重载“借用”已有的运算符,对其赋予多重含义,对自定义的类对象实现自定义的新功能!同一个运算符作用于不同类型数据导致不同的行为运算符重载实质就是函数重载!运算符重载实质就是函数重载!第4页,本讲稿共50页运算符重载的规则运算符重载的规则(1)只能重载已有的只能重载已有的C+运算符运算符,不可自创新的运算符不可自创新的运算符!C+中的运算符除少数几个,全部可以重载,(表8.2),(2)重载后运算符的重载后运算符的优先级和结合性优先级和结合性都都不变不变。(3)重载的功能应当与原有功能相类
4、似重载的功能应当与原有功能相类似 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来讲,重载的功能应当与原有功能相类似不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。第5页,本讲稿共50页表表8.2 C+中可以重载的运算符中可以重载的运算符!+-*&/%=!=|&+=-=*=/=%=&=|=,-*-()=+-newdelete表表8.1 C+8.1 C+中可以重载的运算符中可以重载的运算符表表82 C+中不能重载的运算符中不能重载的运算符.*:?:第6页,本讲稿共50页complex a(2,3),b(4,5),c;c=a+b;c=add(a,b);
5、/complex add(complex a,complex b).c=a.add(b);/complex complex:add(complex b).+(a,b)complex operator+(complex a,complex b);complex operator+(complex b);注意:注意:运算符重载的实质就是函数重载。运算符重载的实质就是函数重载。在实现过程中,首先把指定的表达式转化为对运算符函数的调用,在实现过程中,首先把指定的表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定运算对象转化为运算符函数的实参,然后根据实参的类型来确
6、定需要调用的函数,这个过程在编译过程中完成的。需要调用的函数,这个过程在编译过程中完成的。第7页,本讲稿共50页自定义类中运算符重载的形式自定义类中运算符重载的形式(2种种)重载为类的公有成员函数重载为类的公有成员函数 operator();重载为类的友元函数重载为类的友元函数friend operator();二者区别参数个数不同!成员函数方式重载:参数个数比原来运算数少一个(后缀+、-除外)就是缺省的this指针友元函数方式重载:参数个数与原运算数个数相同,且至少有一个参数是说明该友元的类或是该类的引用单目运算符最好重载为类的成员函数双目运算符则最好重载为类的友元函数!第8页,本讲稿共50
7、页成员方式重载成员方式重载vs友元方式重载友元方式重载成员方式重载:成员方式重载:因每个成员函数总是将当前调用对象(this指针)作为该成员函数隐含的第一个参数运算符的第一个运算对象所以若某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的运算数就是该对象本身(this指针)友元方式重载:友元方式重载:而友元函数中没有this指针,所以友元函数对某个对象的数据进行操作时,就必须通过该对象的名称来实现,因此使用到的所有运算分量都要进行传递 运算数的个数就不会有变化。一般来讲,单目运算符最好重载为成员函数,而双目运算一般来讲,单目运算符最好重载为成员函数,而
8、双目运算符则最好重载为友元函数符则最好重载为友元函数目录第9页,本讲稿共50页8.2 单目运算符重载+/-#include class Sampleprivate:int n;public:Sample(int i=0):n(i)void display()cout n=n endl;void operator+()+n;/+运算符重载运算符重载;void main()Sample a(5);+a;a.display();a.operator+();n=6在在C+C+中,单目运算符有中,单目运算符有+和和 例8.1 第10页,本讲稿共50页+/-前缀、后缀重载前缀、后缀重载“+”、“-”运算符
9、有前缀和后缀两种形运算符有前缀和后缀两种形式式“+”和和“-”重载运算符也有前缀和后缀重载运算符也有前缀和后缀两种两种以以“+”重载运算符为例重载运算符为例 operator+();/前缀运算 operator+(int);/后缀运算 使用使用前缀运算符 +;后缀运算符 +;第11页,本讲稿共50页 例8.1增加后缀+重载 例8.2#include class Sampleprivate:int n;public:Sample(int i):n(i)void operator+()+n;/前缀运算符重载前缀运算符重载void operator+(int)n+=2;/后缀运算符重载后缀运算符重载
10、void display()cout n=n endl;void main()Sample a(5),b(5);a+;/调用后缀运算符重载调用后缀运算符重载+b;/调用前缀运算符重载调用前缀运算符重载a.display();b.display();n=7n=6第12页,本讲稿共50页#include class Sampleprivate:int n;public:Sample(int i):n(i)void operator+()/前缀运算符前缀运算符 +n;void operator+(int)/后缀运算符后缀运算符 n+=2;void display()cout n=n endl;例8.
11、2重载函数带返回值 例8.3n=7n=6重载运算符也可以具有返回值,其使用格式如同一般的成员函数一样。重载运算符也可以具有返回值,其使用格式如同一般的成员函数一样。int operator+()/前缀运算符前缀运算符 +n;return n;int operator+(int)/后缀运算符后缀运算符 n+=2;return n;void main()Sample a(5),b(5);a+;/调用后缀运算符重载调用后缀运算符重载 +b;/调用前缀运算符重载调用前缀运算符重载 a.display();b.display();cout“n=”a+endl;cout“n=”+bendl;int i;S
12、ample c(0);i=+a;/对!对!+a返回值是返回值是int/c=+a;/错!错!C是是sample类型类型第13页,本讲稿共50页#include class Sampleprivate:int n;public:Sample(int i):n(i)Sample operator+()/前缀运算符前缀运算符 +n;return Sample(n);/return*this Sample operator+(int)/后缀运算符后缀运算符 return Sample(n+);void display()cout n endl;改进例8.3更改返回值为对象void main()Sampl
13、e a(5),b(5)c(0),d(0);c=a+;/对!对!C是是sample/类型类型+a/返回值是返回值是int d=+b;coutc=;c.display();couta=;a.display();coutd=;d.display();coutb=;b.display();c=5a=6d=6b=6目录第14页,本讲稿共50页83 双目运算符重载双目运算符重载双目运算符重载为类的成员函数双目运算符重载为类的成员函数双目运算符重载为类的友元函数双目运算符重载为类的友元函数第15页,本讲稿共50页(1)双目运算符重载为类的成员函数双目运算符重载为类的成员函数双目运算符,运算符需要的两个运算数
14、双目运算符,运算符需要的两个运算数B oprd1 B oprd2第一个运算数为类的对象本身(调用此成员函数的对象)第二个运算数通过参数传递class A operator B(oprd2);A a,b;a B b;a.operator B(b);例:a+b;a.operator+(b);第16页,本讲稿共50页#include class Vector/向量向量(x,y)private:int x,y;public:Vector()x=0;y=0;Vector(int x1,int y1)x=x1;y=y1;void display()cout (x ,y )x+v.x;tmp.y=y+v.y
15、;return tmp;/返回返回tmp对象对象Vector Vector:operator-(Vector v)Vector tmp;/定义一个定义一个tmp对象对象tmp.x=x-v.x;tmp.y=y-v.y;return tmp;/返回返回tmp对象对象 例8.4 结果:结果:v1=(6,8)v2=(3,6)v1+v2=(9,14)v1-v2=(3,2)void main()Vector v1(6,8),v2(3,6),v3,v4;cout v1=;v1.display();cout v2=;v2.display();v3=v1+v2;/v3=v1.operator+(v2);cout
16、 v1+v2=;v3.display();v4=v1-v2;/v4=v1.operator-(v2);cout v1-v2=;v4.display();第17页,本讲稿共50页(2)双目运算符重载为类的友元函数双目运算符重载为类的友元函数例8.5运算符所需的运算数都要通过函数的形参表来传递,参数表中形参从左到右的顺序就是运算符运算数的顺序。#include class Vectorprivate:int x,y;public:Vector()x=0;y=0;Vector(int x1,int y1)x=x1;y=y1;void display()cout (x ,y )、”的运算符重载。任意给
17、3个Line类的对象,都可以判断是否有两个相加大于第3个。第19页,本讲稿共50页#include class Lineint len;public:Line(int n):len(n)Line operator+(Line l)/+运算符重载运算符重载 int x=len+l.len;return Line(x);/无名临时对象无名临时对象 bool operator(Line l)/“运算符重载运算符重载 return(lenl.len)?true:false;Line temp(x);return temp;void main()Line a(10),b(5),c(14);if(a+bc
18、&a+cb&b+ca)cout 能够构成一个三角形能够构成一个三角形 endl;elsecout 不能够构成一个三角形不能够构成一个三角形 c)运算过程为运算过程为(a.operator+(b).operator(c)目录第20页,本讲稿共50页85 赋值运算符重载赋值运算符重载在在C+中有两种类型的赋值运算符:中有两种类型的赋值运算符:“”:直接赋值的运算符。“+=”等:先计算后赋值的复合赋值运算符第21页,本讲稿共50页851 运算符“=”的重载赋值运算符“=”的原有含义是将赋值号右边表达式的结果拷贝给赋值号左边的变量。为了保证同类对象之间能够进行赋值操作,每个类应定义赋值操作(重载运算符
19、)。如果程序中没有定义赋值操作,则c编译器自动生成,实现将赋值号右边对象的数据成员依次拷贝到赋值号左边对象的数据成员中。(浅拷贝)第22页,本讲稿共50页浅拷贝带来的悬挂指针问题浅拷贝带来的悬挂指针问题class Mprivate:int*p;public:M(int i);M();void print();M:M(int i)p=new int(i);M:M()delete p;编译器自动生成:编译器自动生成:M:M(const M&m):p(m.p)M&M:operator=(const M&m)p=m.p;return*this;5aM a(5),b(a);b5aM a(5),b(7);
20、7b b=a5a7b第23页,本讲稿共50页自己定义(深拷贝)自己定义(深拷贝)M:M(const M&m)p=new int;*p=*m.p;M&M:operator=(const M&m)*p=*(m.p);return*this;5aM a(5),b(7);7b b=a7a7b5aM a(5),b(a);b5第24页,本讲稿共50页例8.8#include#include class samplepublic:sample(char*pn)p=new charstrlen(pn)+1;strcpy(p,pn);sample(const sample&s);sample()delete p
21、;void disp()coutpendl;sample&operator=(const sample&s);private:char*p;第25页,本讲稿共50页sample:sample(const sample&s)p=new charstrlen(s.p)+1;strcpy(p,s.p);sample&sample:operator=(const sample&s)delete p;p=new charstrlen(s.p)+1;strcpy(p,s.p);return*this;s第26页,本讲稿共50页void main()sample inst1(first object);sa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 重载 精选 PPT
限制150内