- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7
运算符重载
本章导读
运算符重载是面向对象程序设计的重要特征。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同的行为。C++中经重载后的运算符能直接对用户自定义的数据进行操作运算,这就是C++语言中的运算符重载所提供的功能。本章 将重点介绍有关运算符重载方面的内容。为了能自由地使用重载后的运算符,往往需要在自定义的数据类型和预定义的数据类型之间进行相互转换,或者需要在不同的自定义数据类型之间进行相互转换,因此,本章还将讲述类类型的转换。
C++面向对象程序设计
C++面向对象程序设计
第 7 章
第 7 章
运算符重载
PAGE
PAGE 210
运算符重载概述
运算符重载的好处
为什么要重载运算符,运算符重载能带来哪些好处呢?让我们先看下面的程序片断:
int sum_i; float sum_f;
int i1=123, i2=456; float f1=3.45, f2=56.78;
sum_i= i1+i2; couti1+i2 = sum_i; sum_f= f1+f2; coutf1+f2 = sum_f; sum_f= i1+i2+f1;
couti1+i2+f1 =sum_f;
从上面的程序片断可以看到,在表达式i1+i2 中的加号“+”用于完成两个整型数的加运算,在表达式f1+f2 中的加号“+”用于完成两个浮点数的加运算,而在表达式i1+i2+f1 中的加号“+”用于完成两个整型数与一个浮点数的加运算。为什么同一个运算符“+”可以用于完成不同类型的数据的加运算呢?原来C++语言针对预定义数据类型已经对某些运算符做了适当的重载。
当编译程序编译表达式i1+i2 的时候,自动使用整型数相加的算法;编译表达式 f1+f2 时, 编译程序自动使用浮点数相加的算法;而在编译表达式 i1+i2+f1 时,因为被操作数类型不同, 编译程序首先自动完成类型转换,把 i1 和 i2 转换成浮点数,然后采用浮点数相加的算法计算表达式之值。上述这些工作都是编译程序自动完成的,无需程序员操心。有了针对预定义 类型数据的运算符重载,使我们编程时感到十分方便,而且写出的表达式与数学表达式很相 似,符合人们的习惯。试想,如果对不同类型的数据做同样运算(例如,加法)时,需要使 用不同的运算符,那将使人感到多么麻烦,多么不习惯。
但是,C++语言提供的预定义数据类型终究是有限的,我们在解决多种多样的实际问题时,往往需要使用许多的自定义数据类型。例如,在解决科学与工程计算问题时,往往要使用复数、矩阵等。
下面我们定义一个简化的复数类complex:
class complex { public:
double rea,l imag;
complex(double r=0,double i=0)
{ real=r; imag=I;}
};
若要把类complex 的两个对象com1 和com2 加在一起,下面的语句是不能实现的:
main()
{
complex com1(1.,1 2.2),com2(3.3, 4.4),total;
total=com1+com2;
/…/
return 0;
}
错//误
不能实现的原因是complex 类类型不是预定义的基本数据类型,而是用户自定义的数据类型。C++知道如何相加两个int 型数据,或相加两个float 型数据,甚至知道如何把一个int 型数据与一个float 型数据相加,但是C++还无法直接将两个complex 类对象相加。
为了表达上的方便,人们希望预定义的内部运算符(如+、-、*、/等)在特定类的对象上以新的含义进行解释,如希望能够实现total=com1+com2,这就需要用重载运算符“+”来解决。
C++为运算符重载提供了一种方法,即在进行运算符重载时,必须写一个运算符函数, 其名字规定为operator 后随一个要重载的运算符。例如,要重载“+”号,应该写一个名字为operator+的函数。其他的重载运算符也应该以同样的方式命名,如表7-1 所示。
表 7-1
运算符重载函数
函
数
功
能
operator+()
加法
operator-()
operator*()
减法
乘法
operator/()
除法
operator()
小于
?
?
这样,在编译时遇到名为 operator@的运算符函数(@表示所要重载的运算符),就检查传递给函数的参数类型。如果编译器在一个运算符的两边“看”到自定义的数据类型,就执行用户自己的函数,而不是内部运算符的常规程序。
因此,若要将上述类 complex 的两个对象相加,只要编写一个运算符函数operator+(), 如下所示:
complex operator+(complex om1,com
文档评论(0)