第4章 运算符重载.ppt_第1页
第4章 运算符重载.ppt_第2页
第4章 运算符重载.ppt_第3页
第4章 运算符重载.ppt_第4页
第4章 运算符重载.ppt_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、第章 运算符重载,.1 运算符重载概述 4.2 运算符重载的方法 4.3 重载运算符的规则 .4 运算符重载函数的两种形式 .5 几个常用运算符的重载 4.6 指针悬挂问题,Home,4.1运算符重载概述,4.1.1 运算符重载的好处 定义一个简化的复数类complex: class complex public: double real, imag; complex(double r = 0, double i =0 ) real = r; imag = i; ;,Back,Next,函数重载与运算符重载的定义p120,若要把类complex的两个对象com1和com2加在一起,下面的语句是

2、不能实现的: main() complex com1(1.1,2.2),com2(3.3,4.4),total; total=com1+com2; /错误 / return 0; ,Back,Next,若要将上述类complex的两个对象相加,只要编写一个运算符函数operator+(),如下所示: 例4.1复数相加例程 complex operator+(complex om1,complex om2) complex temp; temp.real=om1.real+om2.real; temp.imag=om1.imag+om2.imag; return temp; ,Back,Next

3、,我们就能方便地使用语句: total=com1+com2; 将类complex的两个对象com1和com2相加。 4.2 运算符重载的方法 是定义一个重载运算符的函数,实质上是函数的重载。 格式:函数类型operator 运算符(形参表),Back,Next,4.3 重载运算符的规则,只能对已有的运算符进行重载(表4.1) p125 不能改变运算符运算对象的个数; 不能改变运算符的优选级别; 不能改变运算符的结合性; 重载运算符的函数不能有默认的参数; 重载的运算符必需和用户定义的自定义类型对象一起使用,其参数至少有一个是类对象或其引用;,用于类对象的运算符一般必须重载,“”和“”除外。 若

4、obj1和obj2是类X的两个对象,obj2已被创建,则编译程序遇到如下语句: obj1=obj2; 就调用缺省的赋值运算符函数,将对象obj2的数据成员的值逐个赋给对象obj1的对应数据成员中 运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可是普通函数;,4.4 运算符重载函数的两种形式,Back,Next,4.4.1 运算符重载为友元函数和成员函数,在C+中,可以把运算符重载函数定义成某个类的友元函数,称为友元运算符函数。 也可以把运算符函数定义成某个类的成员函数,称为成员运算符函数。,4.4.2 双目运算符重载,用友元函数进行双目运算符重载。例4.2 (127) 当用友元函数

5、重载双目运算符时,两个操作数都要传递给运算符函数。 2. 作为成员函数的双目运算符重载。如 4.2,Back,Next,对双目运算符而言,成员运算符函数的形参表中仅有一个参数,它作为运算符的右操作数,此时当前对象作为运算符的左操作数,它是通过this指针隐含地传递给函数的。,一般而言,如果在类X中采用友元函数重载双目运算符,而aa和bb是类X的两个对象,则以下两种函数调用方法是等价的: aa bb; / 隐式调用 operator (aa,bb); / 显式调用,Back,Next,一般而言,如果在类X中采用成员函数重载双目运算符,成员运算符函数operator 所需的一个操作数由对象aa通过

6、this指针隐含地传递,它的另一个操作数bb在参数表中显示,aa和bb是类X的两个对象,则以下两种函数调用方法是等价的: aa bb; / 隐式调用 aa.operator (bb); / 显式调用,Back,Next,4.4.3 单目运算符重载,用友元函数重载单目运算符时,需要一个显式的操作数。 例4.3 用友元函数重载单目运算符“+”。,Back,Next,对单目运算符而言,成员运算符函数的参数表中没有参数,此时当前对象作为运算符的一个操作数。 例4.3 作为成员函数的单目运算符重载。,一般而言,如果在类X中采用友元函数重载单目运算符,而aa是类X的对象,则以下两种函数调用方法是等价的:

7、aa ; / 隐式调用 operator(aa); / 显式调用,Back,Next,一般而言,采用成员函数重载单目运算符时,以下两种方法是等价的: aa ; / 隐式调用 aa.operator(); / 显式调用 成员运算符函数operator 所需的一个操作数由对象aa通过this指针隐含地传递。因此,在它的参数表中没有参数。,Back,Next,4.4.4 成员运算符函数与友元运算符函数的比较,对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函数带有两个参数;对单目运算符而言,成员运算符函数不带参数,而友元运算符函数带一个参数(p128)。 (2) 双目运算符一般可以被重载为

8、友元运算符函数或成员运算符函数。左操作数是其它类型时,只能用友元函数形式。,(3) 成员运算符函数和友元运算符函数可以用习惯方式调用,也可以用它们专用的方式调用。 (4) C+的大部分运算符既可说明为成员运算符函数,又可说明为友元运算符函数。究竟选择哪一种运算符好一些,没有定论,这主要取决于实际情况和程序员的习惯。,4.5 几个常用运算符的重载,4.5.1 单目运算符“+”和“-”的重载 在C+中,可以通过在运算符函数参数表中是否插入关键字int来区分前缀和后缀这两种方式。 对于前缀方式+ob,可以用运算符函数重载为: X operator +(); / 成员函数重载(P135页) 或 fri

9、end X operatoer + (X / 友元函数重载,其中ob为类X对象的引用,Back,Next,对于后缀方式ob+,可以用运算符函数重载为 X operator +(int); / 成员函数重载 或 友元函数重载: X operator + (X 在调用后缀方式的函数时,参数int一般被传递给值0。,Back,Next,4.5.2 赋值运算符“=”的重载,对任一类X,如果没有用户自定义的赋值运算符函数,那么系统自动地为其生成一个缺省的赋值运算符函数,定义为类X中的成员到成员的赋值,例如: X X:operator=(const X source) /成员间赋值 ,Back,Next,4.5.3重载流插入运算符和流提取运算符,重载流插入运算符“” istream & operator (istream &,自定义类); 重载流提取运算符“” istream & operator (istream &,自定义类); 例4.4,4.6 指针悬挂问题,在某些特殊情况下,如类中有指针类型时,使用缺省的赋值运算符函数会产生错误。 例4-5,Back,Next,2. 重载赋值运算符解决指针悬挂问题,为了

温馨提示

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

评论

0/150

提交评论