- 1、本文档共289页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ch0810《c程序设计》(谭浩强)
可以看到: 在程序中对运算符“++”进行了重载,使它能用于Time类对象。“++”和“--”运算符有两种使用方式,前置自增运算符和后置自增运算符,它们的作用是不一样的,在重载时怎样区别这二者呢? 针对“++”和“--”这一特点,C++约定: 在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。 例10.6 在例10.5程序的基础上增加对后置自增运算符的重载。修改后的程序如下: #include iostream using namespace std; class Time {public: Time( ){minute=0;sec=0;} Time(int m,int s):minute(m),sec(s){} 请比较例10.1和例10.2,只有两处不同: (1) 在例10.2中以operator+函数取代了例10.1中的complex_add函数,而且只是函数名不同,函数体和函数返回值的类型都是相同的。 (2) 在main函数中,以“c3=c1+c2;”取代了例10.1中的“c3=plex_add(c2);”。在将运算符+重载为类的成员函数后,C++编译系统将程序中的表达式c1+c2解释为 c1.operator+(c2) //其中c1和c2是Complex类的对象 即以c2为实参调用c1的运算符重载函数operator+(Complex c2),进行求值,得到两个复数之和。 虽然重载运算符所实现的功能完全可以用函数实现,但是使用运算符重载能使用户程序易于编写、阅读和维护。在实际工作中,类的声明和类的使用往往是分离的。假如在声明Complex类时,对运算符+,-,*,/都进行了重载,那么使用这个类的用户在编程时可以完全不考虑函数是怎么实现的,放心大胆地直接使用+,-,*,/进行复数的运算即可,十分方便。 对上面的运算符重载函数operator+还可以改写得更简练一些: Complex Complex∷operator + (Complex c2) {return Complex(real+c2.real, imag+c2.imag);} 需要说明的是: 运算符被重载后,其原有的功能仍然保留,没有丧失或改变。 通过运算符重载,扩大了C++已有运算符的作用范围,使之能用于类对象。 运算符重载对C++有重要的意义,把运算符重载和类结合起来,可以在C++程序中定义出很有实用意义而使用方便的新的数据类型。运算符重载使C++具有更强大的功能、更好的可扩充性和适应性,这是C++最吸引人的特点之一。 (1) C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。 (2) C++允许重载的运算符 C++中绝大部分的运算符允许重载。具体规定见书中表10.1。 不能重载的运算符只有5个: . (成员访问运算符) .* (成员指针访问运算符) ∷ (域运算符) sizeof (长度运算符) ?: (条件运算符) 10.3 重载运算符的规则 前两个运算符不能重载是为了保证访问成员的功能不能被改变,域运算符和sizeof运算符的运算对象是类型而不是变量或一般表达式,不具重载的特征。 (3) 重载不能改变运算符运算对象(即操作数)的个数。 (4) 重载不能改变运算符的优先级别。 (5) 重载不能改变运算符的结合性。 (6) 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(3)点矛盾。 (7) 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质。 (8) 用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“”不必用户重载。 ① 赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。 ② 地址运算符也不必重载,它能返回类对象在内存中的起始地址。 (9) 应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。 (10) 运算符重载函数可以是类的成员函数(如例10.2),也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数。 在本章例10.2程序中对运算符“+”进行了重载,使之能用于两个复数的相加。在该例中运算符重载函数operator+作为Complex类中的成员函数。 “+”是双目运算符,为什么在例10.2程序中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的
您可能关注的文档
- 7.30ggj2009基础培训-熊佳 广联达.ppt
- 8北财大刘明辉高级审计理论与实务(课件).ppt
- 8.第五章 植物种类的选择,兰科植物.ppt
- ansys基础教程-2定义模型属性、几何模型(董钢,2013.7).ppt
- abs与asr系统原理see.ppt
- 2015年——高三一轮复习天气系统定稿.ppt
- abs-esp全面讲解(内部资料,不可错过!).ppt
- b寄生虫学第十讲(原虫概论,阿米巴.ppt
- cai20071009-化学位移.ppt
- chapter 7a 电镀和化学镀.ppt
- FRENIC-Ace系列变频器开发:FRENIC-Ace 6000H系列all.docx
- Software系列开发:Prosys_(4).Prosys软件开发工具与环境配置.docx
- FRENIC-Ace系列变频器开发:FRENIC-Ace 5000系列_(11).安全操作与防护措施.docx
- Software系列开发:Profiler_(8).优化方法与实践.docx
- Software系列开发:Prosys_(7).Prosys安全与认证机制.docx
- Programmable controllers系列开发:Profire S_(2).ProfireS系列硬件架构与组件.docx
- Programmable controllers系列开发:Profire S_(4).ProfireS系列编程基础.docx
- Software系列开发:Procidia_(18).Procidia企业级软件开发案例分析.docx
- Software系列开发:Profiler_(9).多线程与并发性能分析.docx
- FRENIC-Ace系列变频器开发:FRENIC-Ace 5000系列_(3).FRENIC-Ace5000系列核心技术解析.docx
文档评论(0)