C程序设计电子教案第7章运算符重载_第1页
C程序设计电子教案第7章运算符重载_第2页
C程序设计电子教案第7章运算符重载_第3页
C程序设计电子教案第7章运算符重载_第4页
C程序设计电子教案第7章运算符重载_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第7章章 运算符重载运算符重载n7.1 运算符重载概述运算符重载概述n7.2 运算符重载的实现运算符重载的实现n7.3 一元运算符重载一元运算符重载n7.4 二元运算符重载二元运算符重载n7.5 特殊运算符重载特殊运算符重载7.1 运算符重载概述运算符重载概述n运算符重载是对已有的运算符赋予多重含义,运算符重载是对已有的运算符赋予多重含义,同一个运算符作用于不同类型的数据导致不同同一个运算符作用于不同类型的数据导致不同类型的行为。类型的行为。n运算符重载的实质就是函数重载。在实现过程运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符中,首先把指定的运算表达式转化

2、为对运算符函数的调用,运算对象转化为运算符函数的实函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。数,这个过程是在编译过程中完成的。返回首页表7-1 c+可以重载的运算符 表7-2 c+不能被重载的运算符运算符重载的规则如下:运算符重载的规则如下: n(1)c+中的运算符除了少数几个以外,全部中的运算符除了少数几个以外,全部可以重载,而且只能重载已有的这些运算符。可以重载,而且只能重载已有的这些运算符。n(2)重载之后运算符的优先级和结合性都不会)重载之后运算符的优先级和结合性都不会改变。

3、改变。n(3)运算符重载是针对新类型数据的实际需要,)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。对原有运算符进行适当的改造。 返回本节7.2 运算符重载的实现运算符重载的实现运算符的重载形式有两种:重载为类的成员函数和重载为运算符的重载形式有两种:重载为类的成员函数和重载为类的友元函数。运算符重载为类的成员函数的语法形式类的友元函数。运算符重载为类的成员函数的语法形式如下:如下: operator ();运算符重载为类的友元函数的语法形式如下:运算符重载为类的友元函数的语法形式如下:friend operator ();返回首页n例例7-1:以成员函数重载运算符重载两字

4、符串加法。以成员函数重载运算符重载两字符串加法。#include #include class string char name256;public: string(char* str) strcpy(name,str); string() string() string operator+(const string&); void display() coutthe string is:nameendl;static char* str;string string:operator+(const string& a) strcpy(str,name); strcat(str,);

5、 return string(str);void main() str=new char256; string demo1(visual c+); string demo2(6.0); demo1.display(); demo2.display();string demo3=demo1+demo2; demo3.display(); string demo4=demo3+programming.; demo4.display(); delete str;此程序的运行结果为:此程序的运行结果为:the string is : visual c+the string is : 6.0the st

6、ring is : visual c+ 6.0the string is : visual c+ programming.n例例7-2:下面程序定义一个下面程序定义一个time类用来保存时间(时、分、秒),通过重类用来保存时间(时、分、秒),通过重载操作符载操作符“+”实现两个时间的相加。实现两个时间的相加。#include class timepublic: time() hours=0;minutes=0;seconds=0; /无参构造函数无参构造函数 time(int h, int m,int s) /重载构造函数重载构造函数 hours=h; minutes=m; seconds=s

7、; time operator +(time&); /操作符重载为成员函数,返回结操作符重载为成员函数,返回结果为果为time类类 void gettime();private: int hours,minutes,seconds;time time:operator +(time& time)int h,m,s;s=time.seconds+seconds;m=time.minutes+minutes+s/60;h=time.hours+hours+m/60;time result(h,m%60,s%60);return result;void time:gettime()couthours

8、:minutes:secondsendl;void main( )time t1(8,51,40),t2(4,15,30),t3;t3=t1+t2;t3.gettime();输出结果为:输出结果为:13:7:10n例例7-4:下面程序修改了例下面程序修改了例7-2,将操作符重载为友元函数实现。,将操作符重载为友元函数实现。 #include class timepublic: time() hours=0;minutes=0;seconds=0; /无参构造函数无参构造函数 time(int h, int m,int s) /重载构造函数重载构造函数 hours=h; minutes=m; s

9、econds=s; friend time operator +(time&,time&); /重载运算符为友元重载运算符为友元函数形式函数形式 void gettime( );private: int hours,minutes,seconds;time operator +(time& time1,time& time2)int h,m,s;s=time1.seconds+time2.seconds; /计算秒计算秒数数m=time1.minutes+time2.minutes+s/60; /计算分数计算分数h=time1.hours+time2.hours+m/60; /计算小时数计算小

10、时数time result(h,m%60,s%60);return result;void time:gettime( )couthours:minutes:secondsendl;void main( )time t1(8,51,40),t2(4,15,30),t3;t3=t1+t2;t3.gettime( );输出结果为:输出结果为:13:7:10返回本节7.3 一元运算符重载一元运算符重载n类的单目运算符可重载为一个没有参数的非静类的单目运算符可重载为一个没有参数的非静态成员函数或者带有一个参数的非成员函数,态成员函数或者带有一个参数的非成员函数,参数必须是用户自定义类型的对象或者是对该

11、参数必须是用户自定义类型的对象或者是对该对象的引用。对象的引用。n在在c+中,单目运算符有中,单目运算符有+和和-,它们是变量自,它们是变量自动增动增1和自动减和自动减1的运算符。在类中可以对这两的运算符。在类中可以对这两个单目运算符进行重载。个单目运算符进行重载。 返回首页如同如同“+”运算符有前缀和后缀两种使用形式一样,运算符有前缀和后缀两种使用形式一样,“+”和和“-”重载运算符也有前缀和后缀两种运算符重载运算符也有前缀和后缀两种运算符重载形式,以重载形式,以“+”重载运算符为例,其语法格式如下:重载运算符为例,其语法格式如下: operator +()(); /前缀运算前缀运算 ope

12、rator +(int); /后缀运算后缀运算使用前缀运算符的语法格式如下:使用前缀运算符的语法格式如下:+;使用后缀运算符的语法格式如下:使用后缀运算符的语法格式如下:+;n例例7-5:成员函数重载示例。成员函数重载示例。#include class increasepublic: increase(int x):value(x) increase & operator+(); /前增量前增量 increase operator+(int); /后增量后增量 void display() cout the value is value endl; private: int value;inc

13、rease & increase:operator+() value+; /先增量先增量 return *this; /再返回原对象再返回原对象increase increase:operator+(int) increase temp(*this); /临时对象存放原有对象值临时对象存放原有对象值 value+; /原有对象增量修改原有对象增量修改 return temp; /返回原有对象值返回原有对象值void main() increase n(20); n.display(); (n+).display(); /显示临时对象值显示临时对象值 n.display(); /显示原有对象显示

14、原有对象 +n; n.display(); +(+n); n.display();(n+)+; /第二次增量操第二次增量操作对临时对象进行作对临时对象进行 n.display();此程序的运行结果为:此程序的运行结果为:the value is 20the value is 20the value is 21the value is 22the value is 24the value is 25n例例7-6:友元函数重载示例。友元函数重载示例。#include class increasepublic: increase(int x):value(x) friend increase & o

15、perator+(increase & ); /前增量前增量 friend increase operator+(increase &,int); /后增量后增量 void display() cout the value is value endl; private: int value;increase & operator+(increase & a) a.value+; /前增量前增量 return a; /再返回原对象再返回原对象increase operator+(increase& a, int) increase temp(a); /通过拷贝构造函数通过拷贝构造函数保存原有对象

16、值保存原有对象值 a.value+; /原有对象增量修改原有对象增量修改 return temp; /返回原有对象值返回原有对象值void main() increase n(20); n.display();(n+).display(); /显示临时对象值显示临时对象值 n.display(); /显示原有对象显示原有对象 +n; n.display(); +(+n); n.display(); (n+)+; /第二次增量操作对第二次增量操作对临时对象进行临时对象进行 n.display();此程序的运行结果为:此程序的运行结果为:the value is 20the value is 20

17、the value is 21the value is 22the value is 24the value is 25返回本节7.4 二元运算符重载二元运算符重载n对于双目运算符,一个运算数是对象本身的数对于双目运算符,一个运算数是对象本身的数据,由据,由this指针给出,另一个运算数则需要通指针给出,另一个运算数则需要通过运算符重载函数的参数表来传递。下面分别过运算符重载函数的参数表来传递。下面分别介绍这两种情况。介绍这两种情况。n对于双目运算符对于双目运算符b,如果要重载如果要重载b为类的成员函为类的成员函数,使之能够实现表达式数,使之能够实现表达式“oprd1 b oprd2”,其中其

18、中oprd1为为a类的对象,则应当把类的对象,则应当把b重载为重载为a类的成员函数,该函数只有一个形参,形参的类的成员函数,该函数只有一个形参,形参的类型是类型是oprd2所属的类型。经过重载之后,表所属的类型。经过重载之后,表达式达式oprd1 b oprd2就相当于函数调用就相当于函数调用“oprd1.operator b(oprd2)”。返回首页n例例7-7:设计一个点类设计一个点类point,实现点对象之间的各种运算。实现点对象之间的各种运算。#include class point int x,y;public:point() x=y=0;point(int i,int j) x=i

19、;y=j;point(point &);point() void offset(int,int); /提供对点的偏移提供对点的偏移void offset(point); /重载,偏移量用重载,偏移量用point类对类对象表示象表示bool operator= =(point); /运算符重载,判断两个对象运算符重载,判断两个对象是否相同是否相同bool operator! =(point); /运算符重载,判断两个对象是否不相同运算符重载,判断两个对象是否不相同void operator+ =(point); /运算符重载,将两个点对象相加运算符重载,将两个点对象相加void operator

20、- =(point); /运算符重载,将两个点对象相减运算符重载,将两个点对象相减point operator+(point); /运算符重载,相加并将结果放在左运算符重载,相加并将结果放在左操作数中操作数中point operator-(point); /运算符重载,相减并将结果放在左操作数中运算符重载,相减并将结果放在左操作数中int getx() return x;int gety() return y;void disp() cout(x,y)x+=p.x; this-y+=p.y;return *this;point point:operator-(point p) this-x-=

21、p.x; this-y-=p.y;return *this;void main() point p1(2,3),p2(3,4),p3(p2);cout1:;p3.disp();p3.offset(10,10);cout2:;p3.disp();cout3:(p2= =p3)endl;cout4:(p2!=p3)endl;p3+=p1;cout5:;p3.disp();p3-=p2;cout6:;p3.disp();p3=p1+p3;/先将先将p1+p3的结的结果放在果放在p1中,然后赋中,然后赋给给p3cout7:;p3.disp();p3=p1-p2;cout运算符重载运算符重载n7.5.8

22、 函数调用运算符重载函数调用运算符重载n7.5.9 i/o运算符重载运算符重载 返回首页7.5.1 赋值运算符重载赋值运算符重载n1运算符运算符“+=”和和“-=”的重载的重载对于标准数据类型,对于标准数据类型,“+=”和和“-=”的作用是将的作用是将一个数据与另一个数据进行加法或减法运算后再一个数据与另一个数据进行加法或减法运算后再将结果回送给赋值号左边的变量中。对它们重载将结果回送给赋值号左边的变量中。对它们重载后,使其实现其他相关的功能。后,使其实现其他相关的功能。n2运算符运算符“=”的重载的重载赋值运算符赋值运算符“=”的原有含义是将赋值号右边表达的原有含义是将赋值号右边表达式的结果

23、拷贝给赋值号左边的变量,通过运算符式的结果拷贝给赋值号左边的变量,通过运算符“=”的重载将赋值号右边对象的私有数据依次拷的重载将赋值号右边对象的私有数据依次拷贝到赋值号左边对象的私有数据中。贝到赋值号左边对象的私有数据中。 1运算符运算符“+=”和和“-=”的重载的重载n例例7-9:“+=”和和“-=”运算符重载。运算符重载。 #include class vector int x,y;public: vector() ; vector(int x1,int y1) x=x1;y=y1; friend vector operator +=(vector v1,vector v2) v1.x+=

24、v2.x; v1.y+=v2.y; return v1; vector operator-=(vector v)vector tmp; tmp.x=x-v.x; tmp.y=y-v.y; return tmp;void display()cout”(“x”,”y”)”endl;void main()vector v1(6,8),v2(3,6),v3,v4;cout”v1=”;v1.display();cout”v2=”;v2.display();v3=v1+=v2;cout”v3=”;v3.display();v4=v1-=v2;cout”v4=”;v4.display();此程序的运行结果为

25、:此程序的运行结果为:v1=(6,8)v2=(3,6)v3=(9,14)v4=(3,2)2运算符运算符“=”的重载的重载图7-1 对象内存分配n例例7-10:重载运算符重载运算符“=”。#include class sampleint n;public:sample() sample(int i) n=i;sample & operator=(sample);void disp() cout”n=”nendl;sample &sample:operator=(sample s) sample:n=s.n; return *this;void main() sample s1(10),s2; s

26、2=s1; s2.disp();此程序的运行结果为:此程序的运行结果为:n=10 返回本节7.5.2 下标运算符重载下标运算符重载下标运算符下标运算符“ ”通常用于在数组中标识数组元通常用于在数组中标识数组元素的位置,下标运算符重载可以实现数组数据素的位置,下标运算符重载可以实现数组数据的赋值和取值。下标运算符重载函数只能作为的赋值和取值。下标运算符重载函数只能作为类的成员函数,不能作为类的友元函数。类的成员函数,不能作为类的友元函数。下标运算符下标运算符“ ”函数重载的一般形式为:函数重载的一般形式为:type class_name:operator (arg_);n例例7-11:下标运算符

27、的重载。下标运算符的重载。#include class demo int vector5;public:demo() ;int &operator (int i) (return vectori; );void main() demo v; for(int i=0;i5;i+)vi=i+1;for(i=0;i5;i+)coutvi ;cout、c & a+cb & b+ca) cout能够构成三角形!能够构成三角形!endl;elsecout不能构成三角形!不能构成三角形!c & a+cb & b+ca) cout能够构成三角形!能够构成三角形!endl;elsecout不能构成三角形!不能构

28、成三角形!endl;返回本节7.5.4 new与与delete运算符重载运算符重载new和和delete只能被重载为类的成员函数,不能重载为友只能被重载为类的成员函数,不能重载为友元。而且,无论是否使用关键字元。而且,无论是否使用关键字static进行修饰,重载进行修饰,重载了的了的new和和delete均为类的静态成员函数。均为类的静态成员函数。运算符运算符new重载的一般形式为:重载的一般形式为:void *class_name:operator new(size_t,);new重载应返回一个无值型的指针,且至少有一个类型为重载应返回一个无值型的指针,且至少有一个类型为size_t的参数。

29、若该重载带有多于一个的参数,则其第的参数。若该重载带有多于一个的参数,则其第一个参数的类型必须为一个参数的类型必须为size_t。运算符运算符delete重载的一般形式为重载的一般形式为void *class_name:operator delete(void *,);n例例7-13:重载重载new和和delete运算符。运算符。 #include #include class memmanagerpublic:void *operator new(size_t size);/分配一块大小分配一块大小为为size的内存的内存void *operator new(size_t size,char

30、 tag); /分配一块大小为分配一块大小为size的内存,并且用字符的内存,并且用字符tag赋值赋值 void operator delete(void *p);/释放指针释放指针p所指向的一块内存空间所指向的一块内存空间;void *memmanager:operator new(size_t size) coutnew1 operatorendl;char *s=new charsize; /分配大小为分配大小为size的内存空间的内存空间*s=a; /用字符用字符a赋值赋值return s; /返回指针返回指针void *memmanager:operator new(size_t s

31、ize,char tag) coutnew2 operatorendl; char *s=new charsize; *s=tag; /用字符用字符tag赋值赋值 return s; /返回指针返回指针void memmanager:operator delete(void *p) coutdelete operatorendl; char *s=(char *)p; /强制类型转换强制类型转换 delete s; /释放内存空间释放内存空间 void main() memmanager *m=new memmanager(); delete m; memmanager *m=new(b) m

32、emmanager(); delete m;返回本节7.5.5 逗号运算符重载逗号运算符重载n逗号运算符是双目运算符,和其他运算符一样,逗号运算符是双目运算符,和其他运算符一样,也可以通过重载逗号运算符来完成期望完成的也可以通过重载逗号运算符来完成期望完成的工作。逗号运算符构成的表达式为工作。逗号运算符构成的表达式为“左运算数,左运算数,右运算数右运算数”,该表达式返回右运算数的值。如,该表达式返回右运算数的值。如果用类的成员函数来重载逗号运算符,则只带果用类的成员函数来重载逗号运算符,则只带一个右运算数,而左运算数由指针一个右运算数,而左运算数由指针this提供。提供。 n例例7-14:给出

33、以下程序的执行结果。给出以下程序的执行结果。#include #includeclass point int x,y;public:point() ;point(int l,int w)x=l;y=w;void disp()cout面积:面积: x*yendl;point operator,(point r)point temp;temp.x=r.x;temp.y=r.y;return temp;point operator+(point r)point temp;temp.x=r.x+x;temp.y=r.y+y;return temp;void main() point r1(1,2),r

34、2(3,4),r3(5,6); r1.disp(); r2.disp(); r3.disp(); r1=(r1,r2+r3,r3); r1.disp();此程序的运行结果为:此程序的运行结果为:面积:面积:2面积:面积:12面积:面积:30面积:面积:30返回本节7.5.6 类型转换运算符重载类型转换运算符重载类型转换运算符重载函数的格式如下:类型转换运算符重载函数的格式如下:operator ()();与以前的重载运算符函数不同的是,类型转换运与以前的重载运算符函数不同的是,类型转换运算符重载函数没有返回类型,因为算符重载函数没有返回类型,因为就就代表了它的返回类型,而且也没有任何参数。代表

35、了它的返回类型,而且也没有任何参数。在调用过程中要带一个对象实参。在调用过程中要带一个对象实参。 n例例7-15:使用转换函数。使用转换函数。/zhuanhuan.hclass complex public: operator double() return real;/zhuanhuan.cpp#include #include zhuanhuan.hvoid main() complex c(7,8); coutc运算符重载运算符重载“-”运算符是成员访问运算符,这种一元的运运算符是成员访问运算符,这种一元的运算符只能被重载为成员函数,所以也决定了它算符只能被重载为成员函数,所以也决定了它不能定义任何参数。一般成员访问运算符的典不能定义任何参数。一般成员访问运算符的典型用法是:型用法是:对象对象-成员成员成员访问运算符成员访问运算符“-”函数重载的一般形式为:函数重载的一般形式为:type class_name:operator-();n例例7-16:重载重载-运算符。运算符。#include class pppublic:int n;float m;pp *operator-()return this;v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论