《运算符重载》PPT课件.ppt
《《运算符重载》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《运算符重载》PPT课件.ppt(83页珍藏版)》请在三一办公上搜索。
1、第7章 运算符重载,7.1 运算符重载概述,1、系统为基本数据类型提供了大量运算符。如:int x,y;x=x+y;表达简洁,使用方便。2、问题的提出:定义复数类。,问题的引入:,定义一个简化的复数类complex:class complex public:double real,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;/错误/
2、return 0;,错误的原因:complex类类型不是预定义的基本数据类型,而是用户自定义的数据类型。C+知道如何相加两个int型数据,或相加两个float型数据。但是C+还无法直接将两个complex类对象相加。为了表达上的方便,人们希望能预定义的运算符在特定类的对象上也能使用,如希望能够实现total=com1+com2;这就需要重载运算符“”来解决。,这一章就学习如何将运算符作用于自定义类型的对象上:即运算符重载,运算符重载的概念,通过定义多个同名函数可以实现函数的重载。在C+语言中,运算符也被看成一种特殊的函数,也能够被重载。在前面已经接触过很多运算符重载的例子。例如:coutHel
3、lo world!;cout56;在这里,同一个运算符“”,完成了两种不同类型数据的输出,这就是通过对运算符“”重载的结果。,在重载某个运算符时,就是定义一个重载运算符的函数,函数名为 operator(为要重载的运算符)。例如:operator+()operator()operator*()operator/()operator()运算符重载是通过定义函数实现的,运算符重载实质上是函数的重载(遵循函数重载的原则)。,【例7.1】用运算符重载实现复数的加运算:,#include iostream.hclass complex public:double real;double imag;com
4、plex(double r=0,double i=0)real=r;imag=i;complex operator+(complex c1,complex c2)complex c;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;return c;,main()complex com1(1.1,2.2),com2(3.3,4.4),total1,total2;total1=operator+(com1,com2);coutreal1=total1.real imag1=total1.imagendl;total2=com1+com2;coutreal
5、2=total2.real imag2=total2.imagendl;return 0;,换个普通函数名?,运算符重载的意义,从功能上来讲,通过运算符能实现的功能通过函数一样能够实现。也就是说运算符重载没有在程序的功能上带来好处。运算符重载可以使程序更加简洁,使表达式更加直观,增加可读性。运算符重载的使用也不宜过多,在完成同样功能的情况下,使用运算符比使用明确的函数调用能使程序更清晰,才使用运算符重载。,运算符重载规则,1.运算符重载不能改变运算符的优先级和结合性。C+语言内部已经规定了所有运算符的优先级。不论运算符作用于什么对象,该优先级都不能改变。也不能通过重载改变一个运算符的结合性。2
6、运算符重载不能改变运算符的操作数的个数。单目运算符只能包含一个操作数,双目运算符必须有两个操作数,不能试图通过运算符重载改变操作数的个数。3运算符重载不能使用默认参数。与普通的函数重载不同,运算符重载时,不能使用默认的参数值,必须明确指出每一个操作数。,4运算符重载只能作用于自定义类型。5不能建立新的运算符。6不能改变运算符的含义。7运算符必须显式重载,不能隐式重载 例如,重载了运算符+和运算符=后,语句 obj3=obj1+obj2;是正确的,但是语句 obj1+=obj2;是不正确的。要想使该语句成立,必须显式重载运算符+=。,运算符重载函数要求至少有一个参数是类的对象。为了能操作对象的数
7、据成员(一般为私有),在进行重载时主要采用两种方式:成员函数方式和友元函数方式。7.2.1 友元运算符函数 在C+中,可以把运算符重载函数定义成某个类的友元函数,称为友元运算符函数。,7.2 运算符重载的两种方式,1.友元运算符函数定义的语法形式 友元运算符函数的原型在类的内部声明格式如下:class X/friend 返回类型 operator运算符(形参表);/;在类外定义友元运算符函数的格式如下:返回类型 operator运算符(形参表)函数体,2.双目运算符重载 双目运算符是有两个操作数的运算符。当用友元函数重载双目运算符时,两个操作数都要传递给运算符函数。【例7.2】用友元运算符函数
8、进行复数运算。,#include class Complex private:double real,imag;public:friend Complex operator+(Complex c1,Complex c2);friend Complex operator-(Complex c1,Complex c2);friend Complex operator*(Complex c1,Complex c2);Complex(double r=0,double i=0);void print();,Complex:Complex(double r,double i)real=r;imag=i;
9、void Complex:print()cout0)cout+;if(imag!=0)coutimagiendl;Complex operator+(Complex c1,Complex c2)Complex temp;temp.real=c1.real+c2.real;temp.imag=c1.imag+c2.imag;return temp;,Complex operator-(Complex c1,Complex c2)Complex temp;temp.real=c1.real-c2.real;temp.imag=c1.imag-c2.imag;return temp;Complex
10、operator*(Complex c1,Complex c2)Complex temp;temp.real=c1.real*c2.real-c1.imag*c2.imag;temp.imag=c1.real*c2.imag+c1.imag*c2.real;return temp;,main()Complex a(1,2),b(3.0,4.0),c,d,e;c=a+b;d=a-b;e=a*b;cout c=;c.print();cout d=;d.print();coute=;e.print();coutf=;f.print();return 0;,程序运行结果为:c=46id=-2-2ie=
11、-5+10i,相当于函数调用“operator+(a,b)”,总结:设有双目运算符,如果要重载 为类的友元函数,则该友元函数也有两个参数,分别为运算符的两个运算对象。重载后,表达式oprd1 oprd2 等同于调用函数operator(oprd1,oprd2)。,3.单目运算符重载 单目运算符只有一个操作数。用友元函数重载单目运算符时,由于友元函数是外部函数,操作数都必须以参数的形式列出来。需要一个显式的操作数。【例7.3】用友元函数重载单目运算符“-”。,#include class ABpublic:AB(int x=0,int y=0)a=x;b=y;friend AB operator
12、-(AB obj);void print();private:int a,b;AB operator-(AB obj)obj.a=-obj.a;obj.b=-obj.b;return obj;,void AB:print()couta=a b=bendl;main()AB ob1(50,60),ob2;ob1.print();ob2=-ob1;ob2.print();ob1.print();return 0;,【例7.4】使用友元函数重载“+”、“-”运算符。#include class coordpublic:coord(int i=0,int j=0)x=i;y=j;void print(
13、);friend coord operator+(coord op);private:int x,y;void coord:print()cout x:x,y:yendl;,coord operator+(coord op)+op.x;+op.y;return op;main()coord ob(10,20);ob.print();operator+(ob);ob.print();+ob;ob.print();return 0;,7.2.2 成员运算符函数 在C+中,可以把运算符函数定义成某个类的成员函数,称为成员运算符函数。当作为成员函数进行重载时,它的左操作数必须是该成员函数所属类的一个对
14、象,因为必须通过类的对象调用该类的成员函数。,1.成员运算符函数定义的语法形式成员运算符函数的原型在类的内部声明格式如下:class X/返回类型 operator运算符(形参表);/在类外定义成员运算符函数的格式如下:返回类型 X:operator运算符(形参表)函数体,2.双目运算符重载为成员函数 对双目运算符而言,成员运算符函数的形参表中仅有一个参数,它作为运算符的右操作数。必须通过类的对象调用该类的成员函数。此时当前调用者对象作为运算符的左操作数,它是通过this指针隐含地传递给函数的。【例7.6】采用成员运算符函数来完成例7.2中同样的工作。,成员函数通过类的对象调用。成员函数中的t
15、his指针初始化为对象的首地址,通过this指针可以直接操作对象的数据成员。左操作数就是调用该运算符函数的对象。,#include class Complex public:Complex operator+(Complex c);Complex operator-(Complex c);Complex(double r=0,double i=0);void print();private:double real,imag;,Complex:Complex(double r,double i)real=r;imag=i;void Complex:print()cout0)cout+;if(im
16、ag!=0)coutimagiendl;,Complex Complex:operator+(Complex c)Complex temp;temp.real=real+c.real;temp.imag=imag+c.imag;return temp;Complex Complex:operator-(Complex c)Complex temp;temp.real=real-c.real;temp.imag=imag-c.imag;return temp;,this-real,main()Complex a(1,2),b(3.0,4.0),c,d;c=a+b;d=a-b;cout c=;c.
17、print();cout d=;d.print();return 0;,该表达式相当于为对“+”运算符重载函数:a.operator+(b)的调用,C+规定赋值运算符“=”不重载就可以用在每一个类上。当然也可以在类的定义中提供赋值运算符重载函数。在不提供的时候,赋值运算符的默认逐个拷贝类的数据成员。,3.单目运算符重载 对单目运算符而言,成员运算符函数的参数表中没有参数,此时当前对象作为运算符的一个操作数。【例7.7】重载单目运算符“+”。,#include class coordpublic:coord(int i=0,int j=0)x=i;y=j;void print();coord o
18、perator+();private:int x,y;void coord:print()cout x:x,y:yendl;,coord coord:operator+()/coord,main()coord ob(10,20);ob.print();ob.operator+();/operator+(ob);ob.print();+ob;ob.print();return 0;,一般而言,采用成员函数重载单目运算符时,以下两种方法是等价的:aa;/隐式调用 aa.operator();/显式调用 成员运算符函数operator 所需的一个操作数由对象aa通过this指针隐含地传递。因此,在它
19、的参数表中没有参数。,7.2.3 成员运算符函数与友元运算符函数的比较,友元函数:(1)所有的参加运算的分量必须显式地列在本友元函数的参数表中,而且这些参数类型中至少有一个是说明该友元的类或对该类的引用。(2)对双目运算符而言,友元运算符函数带有两个参数;对单目运算符而言,友元运算符函数带一个参数。,类的公有成员函数:总以当前调用者对象(*this)作为该成员函数的隐式第一运算分量。若所定义的运算多于一个运算对象时,才将其余的运算分量显式地列在该成员函数的参数表中。,成员函数和友元函数差别的关键原因:成员函数中的this指针,通常,将单目运算符重载为成员函数,将双目运算符重载为友元函数。对于运
20、算符“=、()、”只能作为成员函数重载。双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但有一种情况,必须使用友元函数。当左操作数是内部数据类型的变量或者是其他类的对象时,必须使用友元函数进行重载。【例题7.8】内部数据类型出现在运算符的左边。,#include class ABpublic:AB(int x=0,int y=0)a=x;b=y;friend AB operator+(AB ob,int x);friend AB operator+(int x,AB ob);void show();private:int a,b;AB operator+(AB ob,int x)AB
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算符重载 运算 重载 PPT 课件
链接地址:https://www.31ppt.com/p-5611056.html