




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+程序设计,第五章重载,内容提要:,函数重载运算符重载类型转换,5.1函数重载,关于函数重载,在函数部分已作了简单介绍,本章进一步详细介绍。函数重载指的是两个以上的函数,取同一个名字,只要使用不同类型的参数或参数个数不同,编译器便知道在什么情况下该调用哪个函数。,例5.1,若希望进行两个整数相加,两个实数相加,两个浮点数相加,两个字符串相加,要用四个函数来实现,如果使用C语言编程,必须给四个函数起四个不同的函数名。而C+支持函数重载,因此只需给这四个函数取一个相同的名字即可,将来通过参数的类型来决定调用哪一个具体函数,减少了用户调用函数的麻烦。程序,1、构造函数重载,前面介绍构造函数时,曾经讲过在定义构造函数时可定义多个,只是它们的参数的个数和类型取的不同,这实际就是构造函数的重载。对构造函数的重载,可使系统有几个不同的途径对对象初始化。,2、类成员函数重载,在类中除了构造函数可以重载外,一般的成员函数也可以重载,其重载原则和构造函数相同,重载函数之间靠包含的参数的类型与个数不同进行区分。3、类以外的一般函数重载在函数部分已作过介绍。,5.2运算符重载,运算符重载就是赋予已有的运算符多重含义。C+中通过重新定义运算符,使它能够用于特定类的对象执行特定的功能。例如,通过对+,*,/运算符的重新定义,使它们可以完成复数、分数等不同类的对象的加减乘除运算操作。从而增强了C+语言的处理能力。,1、运算符重载概述,C+中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作,这就提出了对运算符进行重新定义,赋予已有符号以新功能的要求。运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。C+中大多数运算符都能重载,只有少数运算符不能重载。,可以重载的运算符:,+-*/%doubleipart;public:Complex(doublerp=0.0,doubleip=0.0)rpart=rp;ipart=ip;Complexoperator+(Complexc);voidprint();,ComplexComplex:operator+(Complexc)Complextemp;temp.rpart=rpart+c.rpart;temp.ipart=ipart+c.ipart;returntemp;voidComplex:print()cout0)cout“+”;if(ipart!=0)coutipart“in”;intmain()Complexa(1.1,2.2),b(3.3,4.4),c,d;d=a.operator+(b);/显式调用c=a+b;/隐式调用c.print();d.print();return0;,程序中出现的表达式a+b解释为a.operator+(b)(当前对象作为左操作数),3、用友元重载运算符,(1)用友元函数重载运算符的语法在类定义中声明运算符函数friendoperator();与一般的成员函数相似,在类外对其进行定义friendoperator();重载运算符的使用:用友元函数定义的重载运算符和用成员函数定义的重载运算符相同。,(2)说明,为友元函数重载运算符的参数表填写操作数时,要注意友元函数是不属于任何类的,它没有this指针,这与成员函数不同。即当重载为类的友元函数时,参数个数与原运算数的个数相同。,#includeclassComplexprivate:doublerpart;doubleipart;public:Complex(doublerp=0.0,doubleip=0.0)rpart=rp;ipart=ip;friendComplexoperator+(Complexa,Complexb);voidprint();,Complexoperator+(Complexa,Complexb)Complextemp;temp.rpart=a.rpart+b.rpart;temp.ipart=a.ipart+b.ipart;returntemp;voidComplex:print()cout0)cout“+”;if(ipart!=0)coutipart“in”;intmain()Complexa(1.1,2.2),b(3.3,4.4),c,d;c=a+b;/隐式调用d=operator+(a,b);/显式调用c.print();d.print();return0;,4、+和-的重载,类的单目运算符可重载为一个没有参数的非静态成员函数或者带有一个参数的非成员函数,参数必须是用户自定义类型的对象或者是对该对象的引用。在C+中,单目运算符有+和-,它们是变量自动增1和自动减1的运算符。在类中可以对这两个单目运算符进行重载。如同“+”和“”运算符有前缀、后缀两种使用形式,“+”和“-”重载运算符也有前缀和后缀两种运算符重载形式,以“+”重载运算符为例,其语法格式如下:operator+();/前缀运算operator+(int);/后缀运算,使用格式:,使用前缀运算符的语法格式如下:+;使用后缀运算符的语法格式如下:+;使用运算符前缀时,对对象(操作数)进行增量修改,然后再返回该对象。所以前缀运算符操作时,参数与返回的是同一个对象。这与基本数据类型的运算符前缀类似,返回的也是左值。使用运算符后缀时,必须在增量之前返回原有的对象值。为此,需要创建一个临时对象,存放原有的对象,以便对操作数(对象)进行增量修改时,保存最初的值。运算符后缀操作时返回的是原有对象值,不是原有对象,原有对象已经被增量修改,所以,返回的应该是存放原有对象值的临时对象。,单目运算符重载classX/Xoperator+();/;,#includeclasscoordintx,y;public:coord(inti=0,intj=0)x=i;y=j;coordoperator+();voidprint();,coordcoord:operator+()+x;+y;return*this;voidcoord:print()cout“x:”x“;y:”yendl;intmain()coordob(10,20);ob.print();+ob;/隐式调用ob.print();ob.operator+();/显式调用ob.print();return0;,5、运算符和()的重载,运算符()是函数调用运算符,运算符是下标运算符,这两个运算符在重载定义时,不能用友元函数重载,只能采用成员函数重载。函数调用运算符“()”重载的一般形式为:typeclass_name:operator()(形参表);下标运算符“”函数重载的一般形式为:typeclass_name:operator(arg);其中arg为该重载函数的参数。重载了的下标运算符只能且必须带一个参数,该参数给出下标的值。重载函数operator的返回值类型type是引用类型。,6、new和delete的重载,C+提供了new与delete两个运算符用于内存管理,但有些情况下用户需要自己管理内存,为自己所定义的类体系建立一种新的动态内存管理算法,以克服new与delete的不足。这就要重载运算符new与delete,使其按照要求完成对内存的管理。new和delete只能被重载为类的成员函数,不能重载为友元。而且,无论是否使用关键字static进行修饰,重载了的new和delete均为类的静态成员函数。,new和delete的重载形式:,运算符new重载的一般形式为:void*class_name:operatornew(size_t,);new重载应返回一个无值型的指针,且至少有一个类型为size_t的参数。若该重载带有多于一个的参数,则其第一个参数的类型必须为size_t。运算符delete重载的一般形式为:voidclass_name:operatordelete(void*,);delete至少有一个类型为无值型指针的参数。该重载最多可以带有两个参数,若有第二个参数,则其第二个参数的类型必须为size_t。,7、赋值运算符的重载,赋值运算符“=”的原有含义是将赋值号右边表达式的结果拷贝给赋值号左边的变量,通过运算符“=”的重载将赋值号右边对象的私有数据依次拷贝到赋值号左边对象的私有数据中。在正常情况下,系统会为每一个类自动生成一个默认的完成上述功能的赋值运算符,当然,这种赋值只限于由一个类类型说明的对象之间赋值。如果一个类包含指针成员,采用这种默认的按成员赋值,那么当这些成员撤消后,内存的使用将变得不可靠。,#include#includeclassstringchar*ptr;public:string(char*s)ptr=newcharstrlen(s)+1;strcpy(ptr,s);string()deleteptr;voidDisplay()coutptrendl;string,执行p2=p1之后,5.3类型转换,类型转换就是将一种类型的值转换为另一种类型的值。在C+中,类被看作是用户自己定义的抽象数据类型,它也可以像系统预定义的类型那样进行转换。类型转化有两种形式,一种是标准类型转换,它是一种隐式类型转换;另一种是显式类型转换,它包括强制转换法和函数法。,1、一般数据类型间的转换,(1)标准类型转换若使用标准类型转换用的是隐式转换,有如下规则:当char或shor类型对象与int对象进行运算式,将它们都转换为int类型;当两个操作对象类型不一致时,在进行运算之前,级别低的自动转换为级别高的类型;在赋值表达式E1=E2的情况下,赋值运算符右端E2的结果值需转换为E1类型后进行赋值。,(2)显式类型转化,强制转换法。格式为:(类型名)表达式函数法。格式为:类型名(表达式),2、通过构造函数进行类类型转换,在实际应用中,当类定义中提供了单个参数的构造函数时,该类便提供了一种将其它数据类型的树枝或变量转换为用户所定义数据类型的方法。因此,可以说单个参数的构造函数提供了数据转换的功能。,例5.7:,#includestdafx.h#includeiostream.hclassApublic:A()m=0;A(doublei)m=i;voidprint()coutmendl;private:doublem;voidmain()Aa(5);a=10;a.print();,说明:该程序中,赋值语句a=10;中,赋值号两边数值10和对象a是两个不相容的数据类型,可却能顺利通过编译,并正确输出结果,其主要原因是由于单参数的构造函数。编译系统先通过标准数据类型转换,将整型数值10转换double型,然后,再通过类中定义的单参数构造函数double型数值转换为A类类型,最后把它赋值给a。这些转换都是自动隐式完成的。,3、类类型转换函数,又称为类型强制转换成员函数,它是类中的一个非静态成员。它的定义格式:classpublic:operator;这个转换函数定义了由到之间的映射关系。通过转换函数将所标识的类类型转换成为所指定的类型。,例5.8,#includestdafx.h#includeiostream.hclassRationalpublic:Rational(intd,intn)den=d;num=n;operator
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年垃圾焚烧发电与新能源协同产业市场潜力分析报告
- 2025广东广州市素社街道环监所招聘1人模拟试卷及答案详解(新)
- 新能源企业2025年国际化产业链布局与技术协同报告
- 2025年新能源锂电池质量追溯体系优化报告
- 2025年河北雄安新区雄县卫健系统公开招聘专业技术人员71名考前自测高频考点模拟试题完整参考答案详解
- 2025年东方地球物理勘探有限责任公司招聘(25人)考前自测高频考点模拟试题及答案详解(夺冠)
- 2025年广东云浮市云安区招聘教育人才9人(南宁师范大学校区专场)考前自测高频考点模拟试题附答案详解(突破训练)
- 2025华晋焦煤井下岗位高校毕业生招聘260人(山西)模拟试卷及答案详解(名校卷)
- 2025北京市怀柔区卫生健康委员会所属事业单位第二批招聘医务人员4人考前自测高频考点模拟试题及参考答案详解一套
- 护理助手题库导出教程及答案解析
- 年产5万吨电熔锆刚玉新材料扩建项目环境影响报告表
- 慢性阻塞性肺疾病伴肺曲霉病诊治和管理专家共识解读课件
- 2025人教版八年级道德与法治上册全册知识点
- 2025年水利资料员基础知识考试题库及答案1
- T-CAV 032-2025 T-CAS 1061-2025 生物制品临床研究术语
- 民办学校财务管理体系构建与制度汇编
- 2025年时事政治试题库及答案(共550题)
- 助理医师题库及答案
- 食品关键控制点知识培训
- DZ/T 0275.1-2015岩矿鉴定技术规范第1部分:总则及一般规定
- 纸箱委托加工合同协议书
评论
0/150
提交评论