c++面向对象程序设计第4章概要

上传人:今*** 文档编号:108443943 上传时间:2019-10-24 格式:PPT 页数:56 大小:802.50KB
返回 下载 相关 举报
c++面向对象程序设计第4章概要_第1页
第1页 / 共56页
c++面向对象程序设计第4章概要_第2页
第2页 / 共56页
c++面向对象程序设计第4章概要_第3页
第3页 / 共56页
c++面向对象程序设计第4章概要_第4页
第4页 / 共56页
c++面向对象程序设计第4章概要_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《c++面向对象程序设计第4章概要》由会员分享,可在线阅读,更多相关《c++面向对象程序设计第4章概要(56页珍藏版)》请在金锄头文库上搜索。

1、第四章 运算符重载,int sum,a=3,b=2;,(int)=(int) + (int),sum=a+b;,float add, x=3.2, y=2.5;,(float)=(float) + (float),add=x+y;,char str4, c12=“a“, c22=“b“;,(char *)=(char *) + (char *),str=c1+c2;,编译系统中的运算符“”本身不能做这种运算,如何才能若使上式可以运算?,4.1 问题的提出,class A float x,y; public: A(float a=0, float b=0) x=a; y=b; void main

2、(void) A a(2,3), b(3,4), c; c=a+b; 1,两对象不能使用,如何才能若使上式可以运算?,4.1 问题的提出,是否可以利用函数重载的思想来解决该问题?可以! C+通过重新定义运算符,使它能够用于特定类的对象执行特定的功能。 运算符重载就是赋予已有的运算符多重含义。,4.1 问题的提出,运算符的重载从另一个方面体现了OOP技术的多态性,且同一运算符根据不同的运算对象可以完成不同的操作。 为了重载运算符,必须定义一个函数,并告诉编译器,遇到这个重载运算符就调用该函数,由这个函数来完成该运算符应该完成的操作,这种函数称为运算符重载函数 运算符重载函数通常是类的成员函数或者

3、是友元函数。 运算符的操作数通常也应该是类的对象。,4.1 问题的提出,1、在C+中,允许重载的运算符列于表4.1中。 2、在C+中不允许重载的运算符有5个: 成员访问运算符 . 成员指针访问运算符 * 作用域运算符 : 长度运算符 sizeof 条件运算符 ? : 3、只能对C+中已定义了的运算符进行重载 4、当重载一个运算符时,该运算符的优先级和结合律是不能改变的。 5、重载的运算符必须和自定义类型的对象一起使用,其参数至少有一个是 类对象(或类对象的引用)。 6、在C+中不允许重载有三个操作数的运算符。 7、一般用于类对象的运算符都需要重载,但赋值运算符“=”和取地址运算符“&”不需要重

4、载。 8、运算符重载后的功能应该与原功能相类似。,4.2 运算符重载的规则,4.3 将运算符重载为类的成员函数,格式如下: operator() 函数体 ,A operator + (A ,/重载了类A的“+”运算符,其中:operator是定义运算符重载函数的关键字,它与其后的运算符一起构成函数名。,返回类型,运算的对象,关键字,函数名,运算的对象,4.3.1 将双目运算符重载为类的成员函数,class A int i; public:A(int a=0) i=a; void Show(void) cout“i=“iendl; void AddA(A ,没有重载运算符的例子,利用函数完成了加

5、法运算,用和作对象调用函数,4.3.1 将双目运算符重载为类的成员函数,class A int i; public:A(int a=0) i=a; void Show(void) cout“i=“iendl; void AddA(A ,相当于a3=a1.operator+(a2) 由对象a1调用,4.3.1 将双目运算符重载为类的成员函数,重载运算符与一般函数的比较: 相同:1)均为类的成员函数;2)实现同一功能,void AddA(A ,A operator +(A ,a3=a1+a2;,返回值,函数名,形参列表,由对象a3调用,函数调用: a3.AddA(a1,a2);,返回值,函数名,形

6、参,函数调用:,a3=a1.operator+(a2);,由对象a1调用,4.3.1 将双目运算符重载为类的成员函数,12,当用成员函数实现运算符的重载时,运算符重载函数的参数只能有二种情况:没有参数或带有一个参数。 对于有二个操作数的运算符,只能带有一个参数。这参数可以是对象,对象的引用,或其它类型的参数。 对于只有一个操作数的运算符(如+),在重载这种运算符时,通常不能有参数;,4.3.1 将双目运算符重载为类的成员函数,class room float Length; float Wide; public: room(float a=0.0,float b=0.0) Length=a;

7、Wide=b; void Show(void)cout“Length=“Lengtht“Wide=“Wideendl; void ShowArea(void) cout“Area=“Length*Wideendl; room operator+(room ,r4=r1+r2+r3;,(r1+r2);,(r1+r2)+r3;,r4=r1+(r2+r3);,(r2+r3);,r1+(r2+r3);,运算符的优先级和结合律是不能改变的,4.3.1 将双目运算符重载为类的成员函数,class A int i; public:A(int a=0) i=a; void Show(void) cout“i=

8、“iendl; A operator +(A ,相当于a3=a1.operator+(a2),相当于a1.operator+=(a2),4.3.1 将双目运算符重载为类的成员函数,没有返回值,只具有一个操作数的运算符为单目运算符,最常用的为及,结合方向为“自右向左”。,A a, b; b=+a; b=a+;,A a; +a; a+;,可以看出,虽然运算后对象a的值一致,但先自加或后自加的重载运算符函数的返回值不一致,必须在重载时予以区分。,i=3; j = +i;/j=4,先加后使用 k = i+;/k=3,然后i变为4, /即先使用后加,4.3.2 将单目运算符重载为类的成员函数,+为前置运

9、算时,C+规定运算符重载函数的格式为: operator +( ) ; +为后置运算时,C+规定运算符重载函数的格式为: operator +(int) ;,A a, b; b=+a; b=a+;,A operator +( ) ,A operator +(int) ,4.3.2 将单目运算符重载为类的成员函数,class A float x, y; public: A(float a=0, float b=0) x=a; y=b; A operator +( )A t; t.x=+ x; t.y=+y; return t; A operator +(int) A t; t.x=x+; t.y

10、=y+; return t; ; void main(void) A a(2,3), b; b=+a; b=a+; ,4.3.2 将单目运算符重载为类的成员函数,A operator +( ) A t; t.x=+ x; t.y=+y; return t; ,b=+a;,b=a.operator+( );,a,t,3,3,4,4,t作为函数值返回赋给b,A operator +( ) + x; +y; return *this; ,将对象本身作为函数值返回赋给b,4.3.2 将单目运算符重载为类的成员函数,19,A operator +(int) A t; t.x=x+; t.y=y+; re

11、turn t; ,b=a+;,b=a.operator+(3);,a,t,3,2,4,3,t作为函数值返回赋给b,4.3.2 将单目运算符重载为类的成员函数,class incount int c1,c2; public: incount(int a=0,int b=0) c1=a; c2=b; void Show( )cout“c1=“c1t“c2=“c2endl; incount operator+( ) c1+; c2+; return *this; /前置+ incount operator +(int)/后置+ incount c; c.c1=c1; c.c2=c2; c1+; c2

12、+; return c; ; void main( ) incount ic1(10,20),ic2(100,200), ic3 , ic4; ic1.Show ( ); ic2.Show ( ); ic3=+ic1;/ic3=ic1.operator+( ) ic4=ic2+;/ic4=ic2.operator+(3) ic3.Show ( ); ic4.Show ( ); ,c1=10 c2=20 c1=100 c2=200 c1=11 c2=21 c1=100 c2=200,因为结果要赋值,所以函数要有返回值,ic1.c1=11 ic1.c2=21 ic3.c1=11 ic3.c2=21

13、 ic2.c1=101 ic2.c2=201 ic4.c1=100 ic4.c2=200,4.3.2 将单目运算符重载为类的成员函数,用成员函数实现运算符的重载时,运算符的左操作数为当前对象,并且要用到隐含的this指针。 运算符重载函数不能定义为静态的成员函数,因为静态的成员函数中没有this指针。,4.3.2 将单目运算符重载为类的成员函数,4.4 将运算符重载为友元函数,23,运算符重载为成员函数时,是由一个操作数调用另一个操作数。,A a ,b , c; c=a+b;,实际上是c=a.operator+(b);,c=+a;,实际上是c=a.operator+( );,即函数的实参只有一

14、个或没有。,c+=a;,实际上是c.operator+=( a );,重载+=,4.4 将运算符重载为友元函数,24,友元函数是在类外的普通函数,与一般函数的区别是可以调用类中的私有或保护数据。 将运算符的重载函数定义为友元函数,参与运算的对象全部成为函数参数。,A a ,b , c; c=a+b;,实际上是 c=operator+(a, b);,c=+a;,实际上是 c=operator+(a);,c+=a;,实际上是 operator+=( c, a );,4.4 将运算符重载为友元函数,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。 C+规定: “赋值运算符,函数调

15、用运算符(),下标运算符 ,成员运算符 -”等运算符不能重载为友元函数,只能重载为成员函数。 格式为: friend operator() c=a+b; / c=operator+( a, b) friend A operator + (A &a, A &b) .,4.4 将运算符重载为友元函数,class A int i; public:public: A(int a=0) i=a; void Show(void) cout“i=“iendl; friend A operator +(A ,相当于a3=operator+(a1,a2),4.4.1 将双目运算符重载为友元函数,+为前置运算时,它的运算符重载函数的一般格式为: A operator +(A &a) ; +为后置运算时,它的运算符重载函数的一般格式为: A operator +(A &a, int) ;,A a, b; b=+a; b=a+;,A operator +( A a ) ,A operator +(A a, int) ,4.4.2 将单目运算符重载为友元函数,28,class

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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