资源描述:
《C++面向对象程序设计 教学课件 作者 陈维兴 等 第7章 运算符重载.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第7章运算符重载7.1运算符重载概述7.1.1运算符重载的好处定义一个简化的复数类complex:classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}};若要把类complex的两个对象com1和com2加在一起,下面的语句是不能实现的:main(){complexcom1(1.1,2.2),com2(3.3,4.4),total;total=com1+com2;//错误//…return0;}若要将上述类complex的两个对象相加,只要编写一个运算符函数operator+(),如下
2、所示:complexoperator+(complexom1,complexom2){complextemp;temp.real=om1.real+om2.real;temp.imag=om1.imag+om2.imag;returntemp;}我们就能方便地使用语句:total=com1+com2;将类complex的两个对象com1和com2相加。7.2运算符重载函数的两种形式7.2.1友元运算符函数在C++中,可以把运算符重载函数定义成某个类的友元函数,称为友元运算符函数。1.友元运算符函数定义的语法形式友元运算符函数的原型在类的内部声明格式如下:classX{//…friend返回类
3、型operator运算符(形参表);//…}在类外定义友元运算符函数的格式如下:返回类型operator运算符(形参表){函数体}2.双目运算符重载当用友元函数重载双目运算符时,两个操作数都要传递给运算符函数。例7.2用友元运算符函数进行复数运算。一般而言,如果在类X中采用友元函数重载双目运算符@,而aa和bb是类X的两个对象,则以下两种函数调用方法是等价的:aa@bb;//隐式调用operator@(aa,bb);//显式调用3.单目运算符重载用友元函数重载单目运算符时,需要一个显式的操作数。例7.3用友元函数重载单目运算符“-”。一般而言,如果在类X中采用友元函数重载单目运算符@,而aa
4、是类X的对象,则以下两种函数调用方法是等价的:@aa;//隐式调用operator@(aa);//显式调用7.2.2成员运算符函数在C++中,可以把运算符函数定义成某个类的成员函数,称为成员运算符函数。1.成员运算符函数定义的语法形式成员运算符函数的原型在类的内部声明格式如下:classX{//…返回类型operator运算符(形参表);//…}在类外定义成员运算符函数的格式如下:返回类型X::operator运算符(形参表){函数体}2.双目运算符重载对双目运算符而言,成员运算符函数的形参表中仅有一个参数,它作为运算符的右操作数,此时当前对象作为运算符的左操作数,它是通过this指针隐含地
5、传递给函数的。例7.6采用成员运算符函数来完成例7.2中同样的工作。一般而言,如果在类X中采用成员函数重载双目运算符@,成员运算符函数operator@所需的一个操作数由对象aa通过this指针隐含地传递,它的另一个操作数bb在参数表中显示,aa和bb是类X的两个对象,则以下两种函数调用方法是等价的:aa@bb;//隐式调用aa.operator@(bb);//显式调用3.单目运算符重载对单目运算符而言,成员运算符函数的参数表中没有参数,此时当前对象作为运算符的一个操作数。。例7.7重载单目运算符“++”。一般而言,采用成员函数重载单目运算符时,以下两种方法是等价的:@aa;//隐式调用aa
6、.operator@();//显式调用成员运算符函数operator@所需的一个操作数由对象aa通过this指针隐含地传递。因此,在它的参数表中没有参数。7.2.3成员运算符函数与友元运算符函数的比较(1)对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函数带有两个参数;对单目运算符而言,成员运算符函数不带参数,而友元运算符函数带一个参数。(2)双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但有一种情况,必须使用友元函数。(3)成员运算符函数和友元运算符函数可以用习惯方式调用,也可以用它们专用的方式调用,表7-1列出了一般情况下运算符函数的调用形式。(4)C++的大部分
7、运算符既可说明为成员运算符函数,又可说明为友元运算符函数。究竟选择哪一种运算符好一些,没有定论,这主要取决于实际情况和程序员的习惯。7.3几个常用运算符的重载7.3.1单目运算符“++”和“--”的重载在C++中,可以通过在运算符函数参数表中是否插入关键字int来区分前缀和后缀这两种方式。◆对于前缀方式++ob,可以用运算符函数重载为ob.operator++();//成员函数重载或operator++(X&