C-与面向对象程序设计解析课件_第1页
C-与面向对象程序设计解析课件_第2页
C-与面向对象程序设计解析课件_第3页
C-与面向对象程序设计解析课件_第4页
C-与面向对象程序设计解析课件_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

运算符重载

operatoroverloading张俊2006-11-210/7/20231C++与面向对象程序设计运算符重载

operatoroverloading张主要内容和教学要求★掌握常用运算符的重载★理解运算符重载的两种形式10/7/20232C++与面向对象程序设计主要内容和教学要求★掌握常用运算符的重载10/6/20232为什么要重载运算符★应用系统的运算符集;★为自定义类型提供简洁的表达式; Complexa,b,c; 不重载运算符: a.Print();c=Add(a,b); 重载运算符:cout<<a;c=a+b;10/7/20233C++与面向对象程序设计为什么要重载运算符★应用系统的运算符集;10/6/20233运算符重载的实现运算符函数(operatorfunction) Typea,b,c; cin>>a>>b; c=a+b; cout<<c;?????10/7/20234C++与面向对象程序设计运算符重载的实现运算符函数(operatorfunctio当前对象调用成员函数的对象,对于该成员函数来说即为当前对象。10/7/20235C++与面向对象程序设计当前对象调用成员函数的对象,对于该成员函数来说即为当前对象。当前对象(左操作数)10/7/20236C++与面向对象程序设计当前对象(左操作数)10/6/20236C++与面向对象程序关于当前对象的作用1.左操作数作为当前对象调用运算符函数;2.左操作数隐含地作为二元运算符的第一个参数;3.用this指针或者直接访问左操作数的数据成员;4.右操作数作为运算符重载函数的实参;10/7/20237C++与面向对象程序设计关于当前对象的作用1.左操作数作为当前对象调用运算符函数;1运算符重载的限制★一个中心:不能够改变运算符的性质 操作数的个数; 优先级; 结合性; 语法结构;10/7/20238C++与面向对象程序设计运算符重载的限制★一个中心:不能够改变运算符的性质10/6/三个基本点★不能创建新的运算符★不能改变运算符的含义★不能仅仅操作基本数据类型(两个操作数中必须有一个自定义类型)10/7/20239C++与面向对象程序设计三个基本点★不能创建新的运算符10/6/20239C++与面可以不重载的运算符默认情况下,不需要重载: 赋值运算符:= 地址运算符:&10/7/202310C++与面向对象程序设计可以不重载的运算符默认情况下,不需要重载:10/6/2023不可重载和经常重载的运算符★不允许重载的运算符

.

.*

::

?:

sizeof★经常重载的运算符 算术运算符:+

-

*

/

++

-- 关系运算符:>

>=

<

<=

==

!= 赋值运算符:=

+=

-=

*=

/= I/O运算符:<<

>> 一元运算符:[]

()

!

-10/7/202311C++与面向对象程序设计不可重载和经常重载的运算符★不允许重载的运算符10/6/20运算符重载的形式★成员函数形式:运算符函数作为类的成员★非成员函数形式:友元外部函数(全局函数)10/7/202312C++与面向对象程序设计运算符重载的形式★成员函数形式:运算符函数作为类的成员10/Complex类详解10/7/202313C++与面向对象程序设计Complex类详解10/6/202313C++与面向对象程数据成员及构造函数10/7/202314C++与面向对象程序设计数据成员及构造函数10/6/202314C++与面向对象程序赋值运算符成员函数原型成员函数定义成员函数调用10/7/202315C++与面向对象程序设计赋值运算符成员函数原型成员函数定义成员函数调用10/6/20算术运算符的重载成员函数原型思考:为什么只有一个加数?10/7/202316C++与面向对象程序设计算术运算符的重载成员函数原型思考:为什么只有一个加数?10/加法运算符的实现及调用成员函数定义成员函数调用10/7/202317C++与面向对象程序设计加法运算符的实现及调用成员函数定义成员函数调用10/6/2010/7/202318C++与面向对象程序设计10/6/202318C++与面向对象程序设计复合运算的运算符成员函数定义成员函数原型10/7/202319C++与面向对象程序设计复合运算的运算符成员函数定义成员函数原型10/6/20231成员函数定义成员函数调用10/7/202320C++与面向对象程序设计成员函数定义成员函数调用10/6/202320C++与面向对一元运算符的重载成员函数原型成员函数定义成员函数调用10/7/202321C++与面向对象程序设计一元运算符的重载成员函数原型成员函数定义成员函数调用10/6成员函数形式的特点函数定义:作为类的成员函数。函数参数:二元运算符只带一个参数,一元运算符不带参数。函数调用:当前对象作为左操作数,函数参数作为右操作数。a.operator+(b)语法比较晦涩,不易理解10/7/202322C++与面向对象程序设计成员函数形式的特点函数定义:作为类的成员函数。10/6/20友元函数形式的重载友元函数定义友元函数原型友元函数调用10/7/202323C++与面向对象程序设计友元函数形式的重载友元函数定义友元函数原型友元函数调用10/友元函数形式的重载10/7/202324C++与面向对象程序设计友元函数形式的重载10/6/202324C++与面向对象程序友元函数形式的特点函数定义:作为类的友元函数函数参数:二元运算符带两个参数,一元运算符带一个参数函数调用:两个对象都作为函数的参数operator+(a,b);是几元运算符就带几个操作数,语法符合习惯,易懂,但少用。10/7/202325C++与面向对象程序设计友元函数形式的特点函数定义:作为类的友元函数10/6/202成员函数形式遇到的问题★当运算符的左操作数不是该类的对象时,出现问题。 如 Complexa,b; 重载:operator+(constComplex&r) a=3+b;★3不是Complex的对象,不能调用上述重载的运算符。因而不能计算。10/7/202326C++与面向对象程序设计成员函数形式遇到的问题★当运算符的左操作数不是该类的对象时,友元函数形式的另一类用法成员函数原型成员函数定义成员函数调用10/7/202327C++与面向对象程序设计友元函数形式的另一类用法成员函数原型成员函数定义成员函数调用流插入符和提取符的重载cin>>a>>b;cout<<a<<b;运算符的左操作数cout不是Complex类的对象,因此必须采用友元形式的重载。10/7/202328C++与面向对象程序设计流插入符和提取符的重载cin>>a>>b;10/610/7/202329C++与面向对象程序设计10/6/202329C++与面向对象程序设计请分析下列运算符重载的形式T为自定义类型,并设下列运算符都有意义。[1]Ta,bc; intx;[2]cin>>a>>b>>c;cout<<a<<b<<c;[3]a=b; [4]c=b+a; c=b–x;[5]c=x+a; c=x–b;10/7/202330C++与面向对象程序设计请分析下列运算符重载的形式T为自定义类型,并设下列运算符都有String类详解

自课本P311开始10/7/202331C++与面向对象程序设计String类详解

自课本P311开始10/6/20233110/7/202332C++与面向对象程序设计10/6/202332C++与面向对象程序设计逻辑非运算符友元函数的形式请参考P31310/7/202333C++与面向对象程序设计逻辑非运算符友元函数的形式请参考P31310/6/20233重载流插入和提取运算符10/7/202334C++与面向对象程序设计重载流插入和提取运算符10/6/202334C++与面向对象流插入符调用分析10/7/202335C++与面向对象程序设计流插入符调用分析10/6/202335C++与面向对象程序设复制构造函数10/7/202336C++与面向对象程序设计复制构造函数10/6/202336C++与面向对象程序设计赋值运算符10/7/202337C++与面向对象程序设计赋值运算符10/6/202337C++与面向对象程序设计字符串连接“+、+=”10/7/202338C++与面向对象程序设计字符串连接“+、+=”10/6/202338C++与面向对转换运算符有什么样的转换构造函数,就应该提供什么样的转换运算符数据类型转换★算术运算★赋值★实参传给形参★返回值10/7/202339C++与面向对象程序设计转换运算符有什么样的转换构造函数,就应该提供什么样的转换运算Rational类详解10/7/202340C++与面向对象程序设计Rational类详解10/6/202340C++与面向对象10/7/202341C++与面向对象程序设计10/6/202341C++与面向对象程序设计求两个数的最大公约数10/7/202342C++与面向对象程序设计求两个数的最大公约数10/6/202342C++与面向对象程求两个数的最小公倍数10/7/202343C++与面向对象程序设计求两个数的最小公倍数10/6/202343C++与面向对象程对分数进行标准化10/7/202344C++与面向对象程序设计对分数进行标准化10/6/202344C++与面向对象程序设各种构造函数10/7/202345C++与面向对象程序设计各种构造函数10/6/202345C++与面向对象程序设计复制构造函数10/7/202346C++与面向对象程序设计复制构造函数10/6/202346C++与面向对象程序设计成员函数形式

的重载10/7/202347C++与面向对象程序设计成员函数形式

的重载10/6/202347C++与面向对象程赋值运算符的重载10/7/202348C++与面向对象程序设计赋值运算符的重载10/6/202348C++与面向对象程序设算术运算符的重载10/7/202349C++与面向对象程序设计算术运算符的重载10/6/202349C++与面向对象程序设10/7/202350C++与面向对象程序设计10/6/202350C++与面向对象程序设计复合运算符10/7/202351C++与面向对象程序设计复合运算符10/6/202351C++与面向对象程序设计关系运算符10/7/202352C++与面向对象程序设计关系运算符10/6/202352C++与面向对象程序设计10/7/202353C++与面向对象程序设计10/6/202353C++与面向对象程序设计10/7/202354C++与面向对象程序设计10/6/202354C++与面向对象程序设计10/7/202355C++与面向对象程序设计10/6/202355C++与面向对象程序设计10/7/202356C++与面向对象程序设计10/6/202356C++与面向对象程序设计10/7/202357C++与面向对象程序设计10/6/202357C++与面向对象程序设计10/7/202358C++与面向对象程序设计10/6/202358C++与面向对象程序设计成员函数形式的特点★运算符重载函数作为类的成员函数。★二元运算符重载函数只带一个参数,因为另外一个参数隐含为this。operator+(Complex*this,constComplex&);★一元运算符重载函数不带参数。10/7/202359C++与面向对象程序设计成员函数形式的特点★运算符重载函数作为类的成员函数。10/6友元函数形式

的重载10/7/202360C++与面向对象程序设计友元函数形式

的重载10/6/202360C++与面向对象程10/7/202361C++与面向对象程序设计10/6/202361C++与面向对象程序设计10/7/202362C++与面向对象程序设计10/6/202362C++与面向对象程序设计10/7/202363C++与面向对象程序设计10/6/202363C++与面向对象程序设计10/7/202364C++与面向对象程序设计10/6/202364C++与面向对象程序设计10/7/202365C++与面向对象程序设计10/6/202365C++与面向对象程序设计10/7/202366C++与面向对象程序设计10/6/202366C++与面向对象程序设计10/7/202367C++与面向对象程序设计10/6/202367C++与面向对象程序设计请完成其定义10/7/202368C++与面向对象程序设计请完成其定义10/6/202368C++与面向对象程序设计重载<<和>>10/7/202369C++与面向对象程序设计重载<<和>>10/6/202369C++与面向对象程序设计友元函数形式重载的语法10/7/202370C++与面向对象程序设计友元函数形式重载的语法10/6/202370C++与面向对象字符串的比较10/7/202371C++与面向对象程序设计字符串的比较10/6/202371C++与面向对象程序设计插入符的重载10/7/202372C++与面向对象程序设计插入符的重载10/6/202372C++与面向对象程序设计合乎习惯的重载形式★重载二元运算符时带两个参数,较好理解;★书写简单:无需类名和二元作用域运算符。10/7/202373C++与面向对象程序设计合乎习惯的重载形式★重载二元运算符时带两个参数,较好理解;1两种形式的选择时机★左操作数(或者只有左操作数时)是本类的对象(引用)时,必须选用成员函数形式。★左操作数不是本类的对象,必须采用非成员函数的形式,一般是友元函数。★运算符函数不是类的成员函数,但是要访问类的保护或者私有成员时,也可以采用友元函数形式。10/7/202374C++与面向对象程序设计两种形式的选择时机★左操作数(或者只有左操作数时)是本类的对小结1—两种形式★二元运算符以成员函数的形式重载时,只带一个参数,以友元函数形式重载时,有两个参数。★重载(),[],->和任何赋值运算符时,必须采用成员函数形式。10/7/202375C++与面向对象程序设计小结1—两种形式★二元运算符以成员函数的形式重载时,只带一个小结2—两种形式★单目运算符最好被重载为成员函数;★具有可交换性的双目运算符最好两种形式都有(成员函数时适用左操作数为本类对象,友元函数时适用左操作数为其他类的对象)。★尽量重用已有的操作和运算符。10/7/202376C++与面向对象程序设计小结2—两种形式★单目运算符最好被重载为成员函数;10/6/流插入符和提取符的重载10/7/202377C++与面向对象程序设计流插入符和提取符的重载10/6/202377C++与面向对象10/7/202378C++与面向对象程序设计10/6/202378C++与面向对象程序设计前增量运算符的重载Rationalr(1,2); ++r;10/7/202379C++与面向对象程序设计前增量运算符的重载Rationalr(1,2);10/6后增量运算符的重载Rationalr(-1,5); r++;10/7/202380C++与面向对象程序设计后增量运算符的重载Rationalr(-1,5);10/10/7/202381C++与面向对象程序设计10/6/202381C++与面向对象程序设计前增量与后增量的区别★参数的区别(主要区别) operator++(); operator++(int);Rationalr; ++r;r.operator++(); r++;r.operator++(0);//0伪值,仅仅是为了区别前增量和后增量。10/7/202382C++与面向对象程序设计前增量与后增量的区别★参数的区别(主要区别)10/6/202区别之二★返回值的区别: 前增量:先修改当前对象,再返回之,因而应该返回引用。 后增量:先用临时对象保存当前对象,再修改当前对象,然后返回临时对象,因而返回值。10/7/202383C++与面向对象程序设计区别之二★返回值的区别:10/6/202383C++与面向对10/7/202384C++与面向对象程序设计10/6/202384C++与面向对象程序设计还有两个运算符

[]

()10/7/202385C++与面向对象程序设计还有两个运算符10/6/202385C++与面向对象程序设计下标运算符的重载template<classType>Type&Array<Type>::operator[](intindex){ assert(index>=0&&index<nSize); returnpList[index];}Array<int>a(10);A[20]=1;10/7/202386C++与面向对象程序设计下标运算符的重载template<classType>1函数调用运算符()的重载10/7/202387C++与面向对象程序设计函数调用运算符()的重载10/6/202387C++与面向对小结——运算符重载的形式10/7/202388C++与面向对象程序设计小结——运算符重载的形式10/6/202388C++与面向对小结——值返回与引用返回★引用返回可以成为左值,被赋值、修改或者给其他对象赋值;成员函数引用返回可以连续调用(例如<<和>>)★所有赋值运算符都应该引用返回★前增量应该引用返回10/7/202389C++与面向对象程序设计小结——值返回与引用返回★引用返回可以成为左值,被赋值、修改续上★下标运算符引用返回可以修改返回的值★希望改变当前对象的成员函数可以返回引用(例如+)10/7/202390C++与面向对象程序设计续上★下标运算符引用返回可以修改返回的值10/6/20239小结——关于

温馨提示

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

评论

0/150

提交评论