运算符重载应注意的问题

来源 :中国教师教学论坛 | 被引量 : 0次 | 上传用户:mengyidaocaoren
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘要】在计算机程序设计中,运算符重载是多态的一种。这里,运算符被当作多态函数,他们的行为随着其参数类型的不同而不同。运算符并不一定总是符号。
  【关键词】多态性;运算符重载;函数重载;面向对象 ;程序;C++
  1运算符函数据与运算符重载
  运算符重载是计算机语言固有多态性的体现,是构成计算机语言的基础之一。
  C++把重载的运算符视为特殊的函数,称为运算符函数。运算符重载就是函数重载的一种特殊情况。像对待一般重载函数一样,编译系统能够依据使用运算符的不同环境,即参数(操作数)的数量或类型的差异,区分同一运算符的不同含义。
  “运算符重载”是针对C++中原有运算符进行的,不可能通过重载创造出新的运算符。除了.、.*、->*、::、?:这五个运算符外,其他运算符都可以重载。由于很多符号是一元运算符和二元运算符公用的,为了避免含混,不得为重载的运算符函数设置默认值,调用时也就不得省略实参。
  除了new和delete这两个较为特殊运算符以外,任何运算符如果作为成员函数重载时不得重载为静态函数。=、[ ]、()、->以及所有的类型转换运算符只能作为成员函数重载,而且不能是针对枚举类型操作数的重载。
  运算符函数的函数名是由运算符前加关键字operator构成的,在声明运算符或调用运算符时都可以用这个名称。
  2典范运算符的重载
  2.1关于分数类fraction
  fraction的声明和定义包含在头文件fraction.h和程序文件fraction.cpp中。
  一个标准的用fraction表示的分数须满足以下复印件:
  ①分母永远为正,分数和符号用分子表示;
  ②分子分母互质,即总表示为最简分数。
  fraction通过两个私有数据成员num和den分别保存分子和分母,并在必要时调用standardize函数进行标准化处理,以使num和den的值满足标准分数的条件。gcd是求两个整数的最大公约数的函数,standardize在化简分数时要调用它。
  2.2重载取负运算符“-”
  因为fraction用分子的符号代表整个分数的符号,因此所谓“取负”只需对分子num取负就可以了。由于取负运算符“-”是一元运算符,当作为成员函数重载时参数表中没有参数,那个唯一的操作数以this指针的形式隐藏在参数表中。为此,只需要在fraction.h的类声明中增加:
  fraction poerator -()const { return fraction(-num,den);}
  就可以了。由于在类声明中直接给出了完整定义,因此是一个inline函数。
  “-”是一个典型的一元运算符,除++、--外的其他一元运算符的重载都可以参考这里描述的方法。
  2.3重载加法运算符“+”
  “ +”是一个二元运算符,因此作为成员函数重载时参数表中只有一个参数,对应于第二操作数,而第一操作数就是对象本身,仅以this指针的形式隐藏在参灵敏表中。
  “+”是一个典型的二元运算符,除赋值类运算符外的其他二元运算符的重载都可以参考这里描述的方法。
  2.4重载增1运算符“+ +”
  + +既可以是前缀运算符(前增1),又可以是后缀运算符(后增1)。为了区分这两种情况,重载这两个运算符时必须在格式上有所区别:重载后缀+ +时必须多一个虚拟参数:int,因此从形式上看像是一个二元运算符重载。
  2.5重载类型转换符“long”
  类型转换符必须作为成员函数重载。在重载类型转换符时,由于运算符本身已经表示出返回值类型,因此不需要返回值类型的声明。一个分数可以看成是由一个整数部分和一个纯分数部分组成的,为了取得一个分数的整数部分,可为fraction重载类型转换符long。为此可在fraction.h的类声明中增加:
  opertator long()const { return num/den;}
  2.6重载赋值运算符“=”
  赋值运算符只能作为成员函数重载。
  常见的真正需要重载赋值运算符的情况是:类中包含指向动态空间的指针
  赋值运算符=的重载应注意以下几点:
  ①返回值声明为引用,而函数体中总是用语句return *this;返回;
  ②如果参数被声明为指向同类对象的引用或指针,应判别所指向对象的是否与被赋值对象为同一对象,如果是,立即返回,不做任何赋值处理;
  ③如果被赋值对象占用了动态空间或其他资源,应首先释放这些资源,以便接收新的资源;
  ④如果参数被声明为指针或引用,通常应加上const修饰;
  ⑤如果参数被声明为指针,应判别是否为空,以便做出特殊处理;
  ⑥一个类如果需要重载运算符=,通常也就需要定义自己特有的拷贝构造函数,反之亦然。
  2.7重载复合赋值运算符“+=”
  重载复合赋值类运算符,如+=、-=等,也应遵循上述重载赋值运算符的注意事项。
  与赋值运算符不同的是,复合赋值类运算符既可作为成员函数重载也可作为非成员函数重载。在后一种情况下,两个操作数都必须出现在参数表中;为了保持运算符原有的特性,第一参数应当声明为引用(否则就无法改变它的值),返回值也应当像重载“=”那样声明为引用,并在最后将获得新值的第一参数返回。
  2.8重载关系操作符“>”
  重载的关系操作符函数应返回逻辑值。对于 fraction的两个对象,可以通过比较通分后的两个分子来确定它们的大小。为此,可在fraction.h的类声明中增加如下的成员函数声明:   bool operator>(fraction f){ return num*f.den>f.num*den;}
  其他关系运算符可以参照重载。
  2.9重载下标访问运算符“[ ]”
  运算符[ ]只能作为成员函数重载。
  2.10重载C+ +流运算符“<<”和“>>”
  C+ +流的输入运算符<<和输出运算符>>只能作为非类成员函数重载。在一个类中,如有必要,可将<<或>>声明为友元函数。
  2.11二元运算符中,第一个操作数为非对象时,必须使用友元函数。如输入输出运算符<<和>>具体规则概括如下:
  2.12参数和返回值
  当参数不会被改变,一般按const引用来传递(若是使用成员函数重载,函数也为const).
  对于返回数值的决定:
  1) 如果返回值可能出现在=号左边, 则只能作为左值, 返回非const引用。
  2) 如果返回值只能出现在=号右边, 则只需作为右值, 返回const型引用或者const型值。
  3) 如果返回值既可能出现在=号左边或者右边, 则其返回值须作为左值, 返回非const引用。
  3运算符重载应注意的几个问题
  3.1重载的运算符应保持其原有的基本语义
  重载的运算符应该体现为原运算符的功能在新的数据类型上的延伸,它的使用应当使程序中算法的表达显得更流畅、自然,使阅读程序的人在不借助于其他说明资料的情况下就能够正确理解。不要让重载的运算符去勉强承担那些更适于一般函数承担的功能。
  3.2生载的运算符应尽可能保持基原有的特性
  运算符的操作数个数、优先级和结合性是三个最基本的特性,而且是重载时自然得以保持的特性,因此无须采取专门的措施。需要注意的是下面这些特性。
  ①是否要求第一操作数为有左值操作数。
  ②是否修改第一操作数。
  ③操作的结果是否为有左值数据。
  ④应保证第二操作数不被改变。
  3.3运算符的重载应当配套
  某些运算符之间关系密切,存在着某种逻辑上的联系,因此若需要重载其中的某一个,往往就意味着同组的其他运算符也需要重载。
  3.4使用引用参数还是非引用参数?
  非引用参数的优点是:以传值方式传递参数,形参变量只是实参的副本,对形参变量的修改不会影响实参;在相关对象存在只需一个实参的构造函数的情况下,可以充分利用表达式处理过程中的自动转换机制,使表达式显得更自然。但当对象很大或需要深层复制时,非引用参数占用的计算机资源较多,影响参数传递的效率。
  引用参数的优点是:当对象很大或需要深层复制时,可大大减少对资源的占用,提高参数传递的效率。但无法利用系统的自动转换机制。
  3.5作为成员函数重载还是作为非成员函数重载?
  =、[ ]、()、->以及所有的类型转换运算符只能作为成员函数重载。如果允许第一操作数不是同类对象,而是其他数据类型,则只能作为非成员函数重开车。若希望系统在必要时能够利用只需一个实参的构造函数自动对第一操作数进行转换,也应将该运算符作为非成员函数重载;此种情况下,运算符函数的参数应该是非引用参数,否则不能达到所希望的效果。其他情况下一般应作为成员函数重载。
  参考文献
  [1]叶乃文王丹:面向对象程序设计(第2版) 清华大学出版社 2009-03
  [2]萨维奇(Walter Savitch)周靖 C++面向对象程序设计(第7版) 清华大学出版社 2010-01
  [3]冷英男马石安:面向对象程序设计;中国林业出版社 2006-09
  [4]李忠晔刘伟东:面向对象程序设计;清华大学出版社 2011-09
  [5]叶乃文 喻国宝:面向对象程序设计;清华大学出版社 2007-06
其他文献
《中共中央国务院关于深化教育改革全面推进素质教育的决定》指出:“全面推进素质教育,要坚持面对全体学生”。凡是适龄儿童,人人都有受教育的权利,不是只注重一部分学生,更不是只注重少数学生。在教育改革提倡素质教育发展的今天,如何解决、帮助差生转化教育,尤其是班主任工作任重而道远的课题。结合多年的教学工作体验,对差生的转化与教育作以下浅谈:  1寻找差生的形成原因  所谓的差生通常是指除有智障以外的,在学
期刊
【摘要】在中职语文教学中,能否培养出既有个性、适应性和创造性,又有 一定语文实践能力的人才,是衡量中职语文教学改革成功的关键。本文就此提出了一些看法。  【关键词】中职学生;语言能力;训练和培养  目前,中职学校的语文教学一直沿袭着普通中学语文的教学模式,忽视了职业教育自身的特点,学生们无法直接参与解读文本的实践活动,形成不了良好的语言能力。而语言能力是语文素养的重要核心。在素质教育理念下的语文教
期刊
【摘要】语文教学要面向全体学生,有效地提高全体学生的语文水平,就必须重视对学困生的转化。农村初中语文学困生的存在是一个很普遍的现象,本文拟从学困生成因、心理和教师教法上为其创造一个良好的学习环境,以促进学困生的转化。  【关键词】农村;语文学困生;成因;教法  笔者从事语文教学十多年,发现学习语文有困难的学生大有人在,甚至有的学生语文知识已特别贫乏,若任其自由发展,这对他们今后升学、就业和终身学习
期刊
说到农村小学生能力发展和才艺特长培养的现状,我想先从两个我亲眼看到的真实例子说起:  例一:我在一所农村学校工作,有一次,我校组织了一次学生才艺大赛。从报名开始,所有班主任就被难住了,因为自己的班级根本就推选不出来有才艺特长的学生。到了比赛那天,只有两名在市里培训班学习舞蹈和书法的学生展示了自己的特长,而其他学生只是应付了事,比赛也是草草收场。  例二:有一次,学校组织了一次讲故事比赛。由于平时开
期刊
【摘要】在目前语文教学中,确实需要解决一些问题。注意力不集中者、思维拓展不开者、心猿意马者的学生大有人在. 要集中学生的注意力,使学生的愉快的投入的学习中来,可利用音乐的魅力。一、音乐可调动学生学习语文的积极性。二、音乐可锻炼学生丰富的想象力,促进学生思维能力的发展。三、音乐还有助于学生集中注意力。四、音乐有助于学生情感的激发。  【关键词】调动积极性;锻炼想象力;促进思维发展;集中注意力;情感激
期刊
【摘要】少数民族语言由于地域的特殊性和民族的习惯性,与标准普通话之间无论在声母、韵母、声调还是在思维方面都存在一定的差异,迪庆是典型的方言区,方言特色明显,致使大部分学生在学习普通话时,语音方面发音不够标准、方言思维,表达不清楚,难度较大。但是只要针对问题,找准难点,加强训练就能够逐步掌握并得到提高。  【关键词】普通话教学;问题;解决方法  语言文字是人际交流的工具和信息传递的载体,做好语言文字
期刊
【摘要】化学对初中学生来说是一门新学科,教师在备课时应该全面了解学生,必须充分考虑学生的各种因素,才能在课堂教学中教得得心应手,教学效果才会迈上一个新台阶。教师要根据学生的实际情况选取一些贴近学生生活、接近社会的实例或现象来激发学生的探究兴趣,让他们产生探究的渴望。亲密的师生关系和融洽的同学关系,培优帮差,不同层次的学生共同发展。化学实验可以激发学习化学的兴趣,兴趣是直接推动学生主动学习的内在动力
期刊
【摘要】义务教育的均衡发展是贯彻落实科学发展观、建设社会主义和谐社会和实现教育公平的重要内容。义务教育均衡发展存在的问题,虽然在城镇学校之间也存在,但在城镇学校与乡村学校之间表现得更为突出。优质教育资源不断由乡村向城镇集中,承担义务教育的乡村学校处境艰难,城镇与乡村之间义务教育的差距逐渐拉大。择校和借读之风大兴,使弱势学校更加困难。而要达到均衡发展这一目标就要解决师资、办学条件、经费投入和教育思维
期刊
应用题是小学数学教学的重要内容。应用题教学可以帮助学生理解数学概念,掌握运算法则,所以发展学生的逻辑思维能力。发展学生的逻辑思维能力,就是发展学生的比较、抽象、概括、分析、综合、判断、推理等方面的思维能力。  应用题的许多概念彼此之间是有联系的,容易混淆。例如,等分和包含,是几倍和增加了几倍,增加了多少和增加到多少,这些概念需要在相互比较中才能建立或真正理解。  解答应用题是一个复杂的分析、综合的
期刊
【摘要】教研组建设是学校教师队伍建设的关键,教师专业发展决定着新课程实施的成败。教研组长作为学科学术和师德的带头人,应带领教师敬业爱岗铸师魂,科研兴组育师品,专业引领挑重担,一专多能练内功; 努力打造一支符合新课程素质教育要求的师德优良、结构合理、业务过硬  的教研组队伍。  【关键词】学校;教研组建设;教师;专业发展  教研组建设在学校教师队伍建设中发挥着不可替代的作用,又离不开教研组长强有力的
期刊