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

下载本文档

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

文档简介

1、第第6章章 运算符重载运算符重载第第1章章 基本数据与表达式基本数据与表达式 6.1 运算符重载的实质 6.2 用友元函数和成员函数重载运算符的异同 6.3 +和- - 运算符的重载本章主要内容运算符重载的概念、规则以及两种重要的重载形式。几种特殊的运算符重载方法与应用实例。 问题的引入 C+编程中,程序员可以使用内置类型,也可以定义新类型。内置类型可以和C+的丰富运算符集合一起使用。运算符为程序员提供了表达内置类型对象操作的准确概念。对于表达式5+7来说,编译器在处理它时,并不需要知道符号“+”表示什么意思,它可以将这个表达式解释成函数调用的形式: operator+(5,7)在C+中,op

2、erator是关键字,它经常和C+中的一个运算符联用,表示一个运算符函数名,也称重载运算符函数。重载运算符函数可以完成和运算符同样的功能,但功能更强。可见,运算符重载是通过重载函数来完成的。运算符重载的目的在于可以使用现有的运算符去作用于更为复杂的运算对象。例如,对于两个浮点数的加法可以用普通运算符完成: float x=2.0,y=3.0,z;z=x+y;下面的程序用于说明重载函数下面的程序用于说明重载函数operator+(),以使它可以按对复数进行加操,以使它可以按对复数进行加操作的语义执行两个复数的加操作作的语义执行两个复数的加操作。例例 6.1 两个复数相加的运算符重载实现两个复数相

3、加的运算符重载实现/例6-1.cpp#includeclass complexfloat real;float imag; public:complex(float r=0,float i=0) real=r; imag=i; void show() coutreal+ imag”j”operator#()或obj.operator#()。在一个类中,重载二元运算符的一般形式为: 类型 类名:operator#(参数) /相对于该类而定义的操作 由于类中的成员函数带有一个this参数,所以在类中重载二元运算符时,只能指定一个参数。若有某类的两个对象obj1和obj2,则表达式obj1#obj2

4、被编译器解释成obj.operator#(obj2)或this-operator#(obj2)。例例 6.2 对例对例6.1的扩展的扩展/例6-2.cpp#includeclass complexfloat real;float imag;public:complex(float r=0,float i=0) real=r; imag=i; complex operator+(complex &c) float r=real+c.real; float i=imag+c.imag; return complex(r,i);complex operator-(complex &c) float

5、r=real-c.real; float i=imag-c.imag; return complex(r,i);complex operator-() return complex(-real,-imag); void show() cout(real,imag)endl; ;void main() complex c1(2.5,3.7),c2(4.2,6.5); complex c; c=c1-c2; c.show(); c=c1+c2; c.show(); c=-c1; c.show();6.1.3 规则限制规则限制 C+对运算符重载也有一些限制。首先,不能更改任何运算符的优先级;其次,不

6、可改变此运算符所需要的操作数的数目。最后,除了“=”以外,重载运算符都可以为任何派生类所继承。多数C+运算符都可以重载。这些运算符如图6.1所示。图6.2列出了不能重载的运算符。表 6.1 可以重载的运算符可以重载的运算可以重载的运算符符+ */%&|!=+= =*=/=%=&=|=!=&|+ *()newdeletenewdelete不能重载的运算符.*:?:sizeof表 6.2 不能重载的运算符6.2 6.2 用友元函数和成员函数重载运算符的异同用友元函数和成员函数重载运算符的异同 当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数

7、用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:1. 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。如a + b = a.Add(b)2. 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。如+i= i.prePlus()3. 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。如 i+=i.sufPlus(int )调用成员函数运算符的格式如下:.operator () 它等价于 一个运算符函数可能是一类的友元而不是成员。友元函数没有隐含的this指针,因此,当一友元被用来重载一运算符时,如果该

8、运算符是双目的,则两个操作数都被明确地传递给运算符;如果该操作符是单目的,那么就传递单个操作数。仅有的不能使用友元函数来进行运算符重载的运算符是“=”、“()”、“”、“-”,其余的运算符可以使用成员或友元函数来实现运算符的重载。运算符重载为类的友元函数的一般格式为:friend operator ()当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。调用友元函数运算符的格式如下:operator (,) 它等价于 例如:a+b等价于operator +(a,b)。例例 6.3 复数

9、运算的友元函数重载形式复数运算的友元函数重载形式/例6-3.cpp#includeclass complexfloat real,imag; public:complex(float r=0,float i=0) real=r; imag=i; void show() cout(real,imag) 3. 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。 4. 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。 5. 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。 6. 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边

10、的操作数)必须是运算符类的一个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部类型的对象,该运算符函数必须作为一个友元函数来实现。 7. 当需要重载运算符具有可交换性时,选择重载为友元函数。 增量和减量运算符(算前增量、算后增量、算前减量和算后减量)都可以重载。 例如,假设我们希望在用户定义Date对象d1的天数中加1。当编译程序看见算前增量表达式 +d1 时,编译程序产生成员函数调用:d1.operator+() 它的原型是:Date &operator+(); 如果算前增量作为非成员函数实现,则当编译程序看见表达式 +d1 时,编译程序产生函数调用:

11、operator+( d1 )其原型可以在Date类中声明如下:friend Date &operator+( Date & );当编译程序看见算后增量运算符表达式d1+ ,便产生成员函数调用:d1.operator+( 0 )它的原型是:Date operator+( int )其中,0是严格的“哑元值”,使用于算后增量的operator+的参数列表可以和用于算前增量的operator+参数列表相区别。如果算后增量作为非成员函数实现,则当编译程序看见表达式 d1+ 时,编译程序将产生函数调用:operator+( d1, 0 )它的原型将是:friend Date operator+( Da

12、te &, int );再次重申,编译程序使用0这个参数,这样,用于算后增量的operator+的参数列表可以和算前增量的参数列表区分。例例 6.4 +运算符重载的例子运算符重载的例子/例6-4.cpp#include class Date int mo, da, yr; static int dys;public: Date(int m=0, int d=0, int y=0) mo = m; da = d; yr = y; void display() const cout n mo / da / dysdt.mo-1) n -= dysdt.mo-1; if (+dt.mo = 13) dt.mo = 1; dt.yr+; dt.da = n; return dt;关于+和-运算符的重载的一点说明如下:对于“+” 和“-”这两个一元运算符,存在前置和后置的问题,在定义时必须有所区分。(1)用成员函数的形式来进行重载如果+为前增量运算符时,重载函数的一般格式为: ClassName : operator + ( )/如果+为后增量运算符时,重载函数的一般格式为: ClassName : operator + ( int )/(2)非成员函数形式

温馨提示

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

评论

0/150

提交评论