C-第11章运算符重载课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C-第11章运算符重载课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 运算 重载 课件
- 资源描述:
-
1、C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v使得系统的内置运算符适用于类的对象使得系统的内置运算符适用于类的对象之间的操作。提高程序的可读性。之间的操作。提高程序的可读性。C+大学教程 2007.9v希望某些运算符能够对整个对象进行操作,希望某些运算符能够对整个对象进行操作,而不是而不是C C中的简单操作中的简单操作.v例如:例如:+运算符能够实现运算符
2、能够实现2 2个对象间的加。个对象间的加。v类类A A的对象的对象a1a1、a2a2、a3a3,希望:,希望:a3=a1+a2a3=a1+a2;即:分别把对象即:分别把对象a1a1和和a2a2的各个数据成员值对应的各个数据成员值对应相加,然后赋给对象相加,然后赋给对象a3a3。C+大学教程 2007.9v把某些事交给系统去做,用户只要知道相加把某些事交给系统去做,用户只要知道相加就可就可v提出运算符重载,扩充运算符的功能。即:提出运算符重载,扩充运算符的功能。即:对运算符进行重载定义,然后使用,由系统对运算符进行重载定义,然后使用,由系统自动判断究竟采用哪一个具体的运算符。自动判断究竟采用哪一
3、个具体的运算符。v增强了增强了C+C+语言的可扩充性。语言的可扩充性。C+大学教程 2007.9v不是所有的运算符都能重载不是所有的运算符都能重载v重载不能改变运算符的优先级和结合性重载不能改变运算符的优先级和结合性v重载不能改变运算符的操作数个数重载不能改变运算符的操作数个数v不能创建新的运算符不能创建新的运算符v不能改变用于内部类型对象时的含义不能改变用于内部类型对象时的含义v用于用户自定义类型对象,或者和内部类型用于用户自定义类型对象,或者和内部类型的对象混合使用的对象混合使用C+大学教程 2007.9 +-*/%&|!=+=-=*=/=%=&=|=!=&|+-*,-()new dele
4、te new delete .*:?:sizeof 不能重载的运算符:C+大学教程 2007.9v用普通函数实现用普通函数实现v用成员函数实现用成员函数实现v用友元函数实现用友元函数实现C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v创建运算符函数创建运算符函数v运算符函数名为:运算符函数名为:operator后接一个要重载的运算符后接一个要重载的运算符。如
5、:要重载如:要重载“+”运算,函数名为运算,函数名为 operator+。重载重载“-”运算,函数名为运算,函数名为 operator-。v参数表为要参加运算的对象,返回值为运算参数表为要参加运算的对象,返回值为运算结果结果C+大学教程 2007.9#include class complexpublic:int r,i;complex(int rr=0,int ii=0)i=ii;r=rr;complex operator+(complex a1,complex a2)complex t;t.r=a1.r+a2.r;t.I=a1.i+a2.i;return t;void main()comp
6、lex a1(1,2),a2(3,4),b;b=a1+a2;cout b.r b.i;C+大学教程 2007.9v运算符重载通常要对类的私有数据成员运算符重载通常要对类的私有数据成员作操作。如果用普通函数重载,则需要作操作。如果用普通函数重载,则需要通过公有的方法访问私有的数据成员,通过公有的方法访问私有的数据成员,运算速度较慢,或将所有的数据成员都运算速度较慢,或将所有的数据成员都设为公有,直接访问这些数据成员,这设为公有,直接访问这些数据成员,这样将违反类的封装。样将违反类的封装。C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重
7、载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v把运算符函数定义成把运算符函数定义成某个类的友元函数某个类的友元函数,称为友元运算符函数。称为友元运算符函数。v友元函数在类内部的声明友元函数在类内部的声明 friend type operator(参数表参数表);v友元函数的定义:与一般函数相同友元函数的定义:与一般函数相同 type operator(参数表参数表)/函数体函数体C+大学教程 2007.9v友元运算符函数必须有两个参数友元运算符函数必须有两个参数v
8、例:二元加操作符重载为友元函数例:二元加操作符重载为友元函数#includeclass A int x,y;public:A(int xx,int yy):x(xx),y(yy)A()x=0;y=0;friend A operator+(const A&a,const A&b);void show()coutx=x y=yendl;A operator+(const A&a,const A&b)return A(a.x+b.x,a.y+b.y);void main()A a1(5,55),a2(6,66),a3;a3=a1+a2;/调用操作符重载函数调用操作符重载函数:oprator+(a1,
9、a2)a3.show();x=11 y=121C+大学教程 2007.9v友元运算符有一个参数友元运算符有一个参数v例:一元减操作符重载为友元函数例:一元减操作符重载为友元函数#includeclass A int x,y;public:A(int xx,int yy):x(xx),y(yy)A()x=0;y=0;friend A operator-(const A&a);void show()coutx=x y=yendl;A operator-(const A&a)return A(-a.x,-a.y);void main()A a1(5,55);a1=-a1;/调用操作符重载函数调用操作
10、符重载函数:operator+(a1)a1.show();x=-5 y=-55C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C+大学教程 2007.9v运算符重载通常作用在一个类上,因此可定运算符重载通常作用在一个类上,因此可定义为义为类的成员函数或友元函数类的成员函数或友元函数。v成员运算符函数的声明成员运算符函数的声明 class X/type operator(参数表)参数表)
11、/v成员运算符函数的定义成员运算符函数的定义 type X:operator(参数表)参数表)/函数体函数体 C+大学教程 2007.9v成员运算符只需要一个参数,作为运算符的右操作数,成员运算符只需要一个参数,作为运算符的右操作数,当前对象作为左操作数。当前对象作为左操作数。v例例1 1:二元加操作符重载为成员函数。:二元加操作符重载为成员函数。#include class A int x,y;public:A(int xx,int yy):x(xx),y(yy)A()x=0;y=0;A operator+(A b)A tmp;tmp.x=x+b.x;tmp.y=y+b.y;return t
12、mp;void show()coutx=x y=yendl;void main()A a1(5,55),a2(6,66),a3;a3=a1+a2;/a3=a1.operator+(a2);a3.show();x=11 y=121C+大学教程 2007.9v成员运算符无参数成员运算符无参数v例:一元减操作符重载为成员函数例:一元减操作符重载为成员函数#includeclass A int x,y;public:A(int xx,int yy):x(xx),y(yy)A()x=0;y=0;A operator-()return A(-x,-y);void show()coutx=x“y=y-这这4
13、 4种操作符必须重载成成员函种操作符必须重载成成员函数外,其他操作符重载成友元函数较好。数外,其他操作符重载成友元函数较好。例,例,a a是类是类A A的一个对象,对于表达式:的一个对象,对于表达式:27.5+a27.5+a对友元函数不存在问题:对友元函数不存在问题:operator+(A(27.5),a)operator+(A(27.5),a)但是,对成员函数存在问题:但是,对成员函数存在问题:(27.5).operator+(a)(27.5).operator+(a)/非法:非法:27.527.5不是一个对象,无不是一个对象,无thisthis指针。指针。C+大学教程 2007.9v成员运
14、算符函数和友元运算符函数都可用成员运算符函数和友元运算符函数都可用习惯方式调用,也可用专用方式调用。习惯方式调用,也可用专用方式调用。习惯方式习惯方式友元运算符调友元运算符调用方式用方式成员运算符调成员运算符调用方式用方式a+boperator+(a,b)a.operator+(b)-aoperator-(a)a.operator-()C+大学教程 2007.9v简介简介v用普通函数重载用普通函数重载v用友员函数重载用友员函数重载v用成员函数重载用成员函数重载v典型的运算符重载典型的运算符重载v输入输出重载输入输出重载v实例研究:实例研究:array类类v实例研究:实例研究:string类类C
15、+大学教程 2007.9v+和和-的重载的重载v=的重载的重载v类型转换类型转换C+大学教程 2007.9v、-:是一元操作符:是一元操作符v但是,可以是前缀或后缀。所以,重载但是,可以是前缀或后缀。所以,重载时有所不同。时有所不同。v区分方法:区分方法:前缀:一元操作符。前缀:一元操作符。后缀:二元操作符。后缀:二元操作符。C+大学教程 2007.9v成员函数重载成员函数重载 +ob重载为:重载为:ob.operator+()ob-重载为:重载为:ob.operator-(int)v友元函数重载友元函数重载 +ob重载为:重载为:operator+(X&ob)ob-重载为:重载为:opera
16、tor-(X&ob,int)v调用时,参数调用时,参数int一般传递给值一般传递给值0。C+大学教程 2007.9#includeclass Counter unsigned value;public:Counter(int v=0)value=v;Counter operator+()value+;cout1.value ;return*this;Counter operator+(int)Counter t;cout2.value ;t.value=value+;return t;void display()coutvalueendl;void main()Counter a(11),b(
17、22),c;+a;/自动调用自动调用 operator+()a.display();c=b+;/自动调用自动调用operator+(int)b.display();c.display();1.12 122.22 2322 */C+大学教程 2007.9#includeclass Counter unsigned value;public:Counter(int v=0)value=v;friend Counter operator+(Counter&);friend Counter operator+(Counter&,int);void display()const coutvalueend
18、l;Counter operator+(Counter&cc)cc.value+;cout1.cc.value ;return cc;Counter operator+(Counter&cc,int)Counter t;cout2.cc.value=0)if(s1i 9|s1i 0)cout set error;i=-1;else sj=s1i;-i;+j;for(;j 128;+j)sj=0;longlong()for(int i=0;i128;+i)si=0;C+大学教程 2007.9longlong operator+(const longlong&p1,const longlong&p
19、2)longlong t;int i,j=0;for(i=0;i 10)j=t.si/10;else j=0;t.si=t.si%10+0;return t;C+大学教程 2007.9longlong operator+(const longlong&p1,const int&p2)longlong t;int i,j=0;for(i=0;i 10)j=t.si/10;else j=0;t.si=t.si%10+0;return t;C+大学教程 2007.9void show()int i=127;while(si=0)-i;/去掉高位去掉高位0 while(i=0)coutsi;-i;co
20、utendl;C+大学教程 2007.9void main()longlong a(123),b(345),c;c=a+b;c.show();c=a+5;c.show();648128C+大学教程 2007.9v+和和-的重载的重载v=的重载的重载v类型转换类型转换C+大学教程 2007.9v对任一类,如果用户没有自定义赋值运算符函数,对任一类,如果用户没有自定义赋值运算符函数,那么系统为其生成一个缺省的赋值运算符函数,那么系统为其生成一个缺省的赋值运算符函数,在对应成员间赋值。在对应成员间赋值。X&X:operator=(const X&source)/成员间对应赋值成员间对应赋值 一旦创建
21、了对象一旦创建了对象x1,x2,可以用可以用 x1=x2赋值。赋值。C+大学教程 2007.9v有时,使用缺省运算符函数会产生错误。如:有时,使用缺省运算符函数会产生错误。如:#include#include Class string char*ptr;public:string(char*s)ptr=new charstrlen(s)+1;strcpy(ptr,s);string()delete ptr;void print()coutptrendl;void main()string p1(“chen”);string p2(“);p2=p1;cout “p2:”;p2.print();c
22、out “p1:”;p1.print();/*p1指向的空间会丢失指向的空间会丢失*/C+大学教程 2007.9v显式定义一个赋值运算符重载函数,使显式定义一个赋值运算符重载函数,使p1和和p2有各自的存储空间,实现方法如下:有各自的存储空间,实现方法如下:string&string:operator=(const string&s)if(this=&s)return*this;delete ptr;ptr=new charstrlen(s.ptr)+1;strcpy(ptr,s.ptr);return*this;C+大学教程 2007.9#include#include class stri
23、ngchar*ptr;public:string(char*s)ptr=new charstrlen(s)+1;strcpy(ptr,s);string()delete ptr;void print()coutptrendl;string&operator=(const string&);string&string:operator=(const string&s)if(this=&s)return*this;delete ptr;ptr=new charstrlen(s.ptr)+1;strcpy(ptr,s.ptr);return*this;void main()string p1(che
24、n);string p2();p2=p1;coutp2:;p2.print();cout=0)if(s1i 9|s1i 0)cout set error;i=-1;else sj=s1i;-i;+j;for(;j 128;+j)sj=0;在程序中可用:在程序中可用:a=“1234567890123”;C+大学教程 2007.9v在上面的赋值运算符重载函数中,函数在上面的赋值运算符重载函数中,函数的参数是的参数是char*,这样会使得,这样会使得c=a+b这这样的运算不能执行,因为表达式的右边样的运算不能执行,因为表达式的右边是一个对象而不是字符串。是一个对象而不是字符串。v解决方法:可以用函数
25、重载再写一个赋解决方法:可以用函数重载再写一个赋值函数,他的参数是对象值函数,他的参数是对象C+大学教程 2007.9v+和和-的重载的重载v=的重载的重载v类型转换类型转换C+大学教程 2007.9v隐式类型转换隐式类型转换 赋值时赋值时 运算时运算时v显式类型转换显式类型转换 强制转换法:强制转换法:(类型名)表达式类型名)表达式 函数法:类型名(表达式)函数法:类型名(表达式)C+大学教程 2007.9v通过构造函数进行类型转换通过构造函数进行类型转换#include class example int num;public:example(int n)num=n;void print(
展开阅读全文