1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章 运算符超载 面向对象的核心概念之一是多态性。 所谓多态,是指一个名字(符号)具 有多种含义。 利用超载(或称为重载)实现多态性。 有函数和运算符超载。 一个类就是用户定义的一个类型。因此,类类型可以作为参数类型,可以作为返回类型;可以定义一个类的单个对象,也可以说明对象数组,甚至还可能有类类型常量。 运算符表达简单的操作,很直观,但只能对于语言定义的类型(的数据)进行操作。data1+data2*data3的表示就比multiply data2 by data3 and add the result to data1直观得多。 对于用户定义的类型,某些操作也想使用运算符来表示,则需要对运算符进行超载。 在基本数据类型上,系统提供了许多预定义的运算符,它们以一种简洁的方式工作。 但是,两个串类的对象的合并: class String{ public:… String string_cat(String); … }; String str1,str2; Str2=str1.string_cat(str2); 表达起来就不如: str2=str1+str2; 那样简洁。 为了表达上的方便,希望已预定义的运算符,也可以在特定类的对象上以新的含义进行解释。如在string类对象str1,str2的环境下,运算符“+”能被解释为串str1和str2的合并。 换言之,希望预定义运算符能被超载,使得某个类的对象能够直接使用运算符来表示对对象的操作。 C语言中,有许多预定义的运算符例如“+”,它可以用于int数据,也可用于float类型数据,虽然使用相同的运算符,但生成的目标代码不相同,这时,“+”运算符具有两种不同的解释(实现代码)。 也就是说,像“+”这样的运算符在C语言中已经被超载。不幸的是,C语言仅支持少量有限的运算符超载。 C++语言扩充了这个功能,允许预定义运算符由用户在不同的上下文中做出不同的解释。即:如果是类类型的对象使用运算符,则使用的是运算符新的含义;而其他类型的数据使用运算符,使用的是运算符原来的含义。 在原来预定义的运算符的含义的基础上, 再定义对于某个用户定义类型的对象进行操作的新的含义。这就是运算符超载。 运算符超载后,优先级和结合性不变。 new和delete在C++中被视为运算符,它们也可以通过运算符函数进行超载。 有一个特殊成员函数:类型转换函数。 本章介绍 运算符超载的原理和使用; new和delete的超载; 类类型转换。 4.1 超载运算符 大多数系统预定义的可以通过运算符超载函数定义它们对用户定义类型进行操作的新的含义。只有少数的C++的运算符不能超载: :: # ?: . .* * (*仅前缀使用时不能超载) 当然,不是运算符的符号,如“;”等是不能超载的,C++语言不允许的运算符也不能超载,如“$”和“**”等。 超载运算符时,不能改变它们的优先级,不能改变它们的结合性,也不能改变这些运算符所需操作数的数目。 对象可以直接使用运算符‘=’和‘’。 超载以后,可以按这些运算符的表达方式使用。例如,在一个string类中超载了运算符“+”为两个串的合并,则 string str1,str2,str3; str3=str1+str2; //合并串 对复数的“加法”操作 class Com { double re,im; public: Com(double r,double i):re(r),im(i) { } Com( ){ re=0;im=0;} ?Com add_Com(Com); …}; Com Com :: add_Com(Com cobj) { Com temp; temp.re=re+cobj.re; temp.im=im+cobj.im; return temp; } void main( ) { Com obj1(1,2),obj2(3,4); Com obj3=obj1.add_Com(obj2); … } 对于2个复数相加,定义了成员函数add_Com(Com )实现该操作,使用obj1.add_Com(obj2); 表示该函数的调用,不太直观。能不能将2个复数相加表示为:obj1+obj2 呢? C++约定,如果一个成员函数的函数名字是特殊的,由关键字operator加上一个运算符构成,如operator+,那么,obj1+obj2就表示该函数的调用,即obj1.operator+(obj2)。 obj1+obj2称为函数operator+(…)的隐式调用形式; obj1.operator+(obj2) 称为

文档评论(0)

638922bb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档