运算符重载应注意问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
运算符重载应注意问题

运算符重载应注意问题   【摘要】在计算机程序设计中,运算符重载是多态的一种。这里,运算符被当作多态函数,他们的行为随着其参数类型的不同而不同。运算符并不一定总是符号。   【关键词】多态性;运算符重载;函数重载;面向对象 ;程序;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重载复合赋

文档评论(0)

bokegood + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档