运算符重载与友元.ppt
《运算符重载与友元.ppt》由会员分享,可在线阅读,更多相关《运算符重载与友元.ppt(56页珍藏版)》请在三一办公上搜索。
1、第6章 运算符重载与友元,面向对象程序设计,2023/10/19,第6章运算符重载与友元,2,内容提要,运算符重载的目的、定义和实质 运算符重载的规则 运算符重载的两种形式 友元的作用和定义,2023/10/19,第6章运算符重载与友元,3,提出问题,复数的加减运算问题:对于非基本数据类型,如复数、分数,如何在程序中进行运算?能否直接用运算符(+、-、*、/)进行运算?,2023/10/19,第6章运算符重载与友元,4,分析问题,自定义一个复数类Complex完成复数的加减运算设计复数类class Complex/复数类public:Complex(double r=0.0,double i=
2、0.0)/构造函数 real=r;image=i;private:double real,image;/定义实部、虚部;,2023/10/19,第6章运算符重载与友元,5,思考,是否能通过下面的代码完成复数的加减运算:int main()/定义一个复数对象c1,其实部为2,虚部为2.5 Complex c1(2,2.5);Complex c2(3,1.4);Complex c3,c4;c3=c1+c2;c4=c1-c2;return 0;,2023/10/19,第6章运算符重载与友元,6,编译程序,显示:,2023/10/19,第6章运算符重载与友元,7,说明,C+预定义的“+”、“-”运算只
3、支持基本数据类型,并不支持用户自定义类型。复数类的加减运算不能采用系统预定义的运算符“+”、“-”完成,那么编写成员函数来实现加、减运算。,2023/10/19,第6章运算符重载与友元,8,重新设计复数类Complex,class Complex public:Complex(double r=0.0,double i=0.0)/构造函数 real=r;image=i;double Real()return real;/返回复数的实部 double Imag()return image;/返回复数的虚部 Complex add(Complex,2023/10/19,第6章运算符重载与友元,9,
4、完成复数与复数相加Complex Complex:add(Complex,成员函数定义,2023/10/19,第6章运算符重载与友元,10,完成复数与实数相加Complex Complex:add(double d)Complex temp;temp.real=real+d;temp.image=image;return temp;完成复数与复数相减Complex Complex:sub(Complex,2023/10/19,第6章运算符重载与友元,11,完成复数与实数相减Complex Complex:sub(double d)Complex temp;temp.real=real-d;te
5、mp.image=image;return temp;完成复数间的赋值运算void Complex:set_value(Complex,2023/10/19,第6章运算符重载与友元,12,int main()Complex c1(2,2.5);Complex c2(3,1.4);Complex c3,c4;c3.set_value(c1.add(c2);c4.set_value(c1.sub(c2);coutc3=c3.Real()+i c3.Imag()endl;coutc4=c4.Real()+i c4.Imag()endl;return 0;,不如c3=c1+c2直观!,2023/10/
6、19,第6章运算符重载与友元,13,用函数的方式将复数的加减运算表示出来远不如用运算符“+”、“-”直观 如果复数的运算能够用已有的运算符表示出来,则程序的易读性会大大增强,同时更符合人的思维习惯 C+提供了运算符重载机制,使得系统预定义的运算符能够完成用户自定义数据类型的运算,说明,2023/10/19,第6章运算符重载与友元,14,运算符重载的定义,赋予系统预定义的运算符多重含义,使同一个运算符既可以作用于预定义的数据类型,也可以作用于用户自定义的数据类型 重载运算符为类的成员函数,其具体语法格式为::operator();,2023/10/19,第6章运算符重载与友元,15,在复数类中重
7、载运算符,class Complex/复数类public:Complex(double r=0.0,double i=0.0)real=r;image=i;const double Real()return real;const double Imag()return image;Complex operator+(Complex,2023/10/19,第6章运算符重载与友元,16,operator是进行运算符重载的关键字是该运算符涉及的操作数运算符重载为成员函数最多有一个形参 运算符重载的实质就是函数重载,只不过函数名换成了关键字operator和具体要重载的运算符了但是运算符重载也有别于函
8、数重载,运算符重载的函数参数就是该运算符涉及的操作数,因此运算符重载在参数个数上是有限制的,这是它不同于函数重载之处。,说明,2023/10/19,第6章运算符重载与友元,17,例6-2,#include using namespace std;class MyStringpublic:MyString(const char*=0);/定义构造函数 MyString(const MyString,2023/10/19,第6章运算符重载与友元,18,MyString:MyString(const MyString,赋值构造函数,2023/10/19,第6章运算符重载与友元,19,重载operat
9、or=,MyString,2023/10/19,第6章运算符重载与友元,20,重载operator=,MyString,2023/10/19,第6章运算符重载与友元,21,重载operator,/返回第i个位置的字符char,2023/10/19,第6章运算符重载与友元,22,重载operator=,bool MyString:operator=(const MyString,2023/10/19,第6章运算符重载与友元,23,int main()MyString s(How are you?),s1=s;cout字符串How are you?第6个位置的字符是:s5endl;if(s=How
10、)cout两字符串比较结果:equalendl;elsecout两字符串比较结果:unequalendl;s1=Fine;return 0;,if(How=s)是否可以?,2023/10/19,第6章运算符重载与友元,24,说明,在重载赋值运算符时,要注意进行自赋值检测。所谓自赋值是指将对象赋值给它本身。运算符重载使系统预定义的运算符可以作用于用户自定义类型,但绝不能改变运算符原有的优先级、结合性以及语法结构。运算符重载为成员函数时,左操作数必须是对象本身,2023/10/19,第6章运算符重载与友元,25,运算符重载的规则,重载的功能应当与原有功能类似,不能改变原运算符的操作数个数,同时至少
11、要有一个操作数的类型是自定义类型。重载之后运算符的优先级和结合性都不会改变,并且要保持原运算符的语法结构。参数和函数值类型都可以重新说明。,2023/10/19,第6章运算符重载与友元,26,不能重载的运算符,2023/10/19,第6章运算符重载与友元,27,思考,能否在例6-3中实现if(How=s)?是否可以将operator=实现为如下形式?bool operator=(const char*pstr,const MyString 其中,第一个参数pstr代表运算符=的左操作数,第二个参数str1代表右操作数,2023/10/19,第6章运算符重载与友元,28,根据类的封装性,一般将数
12、据成员声明为私有成员,外部不能直接访问,只能通过类的公有成员函数对私有成员进行访问。有时,需要频繁地调用成员函数来访问私有成员,这就存在一定的系统开销。C+从高效的角度出发,提供友元机制,使被声明为友元的全局函数或者其他类可以直接访问当前类中的私有成员,又不改变其私有成员的访问权限。,友元,2023/10/19,第6章运算符重载与友元,29,友元可以是一个全局函数,也可以是一个类的成员函数,还可以是一个类。如果友元是函数,则称为友元函数。如果友元是一个类,则称为友元类。友元类的所有成员函数都是友元函数,可以访问被访问类的任何成员。友元声明以关键字friend开始,只能出现在被访问类的定义中。具
13、体格式如下 friend();friend class;,友元的定义,2023/10/19,第6章运算符重载与友元,30,例6-3,class MyString;bool operator=(const MyString,2023/10/19,第6章运算符重载与友元,31,bool operator=(const MyString,2023/10/19,第6章运算符重载与友元,32,int main()MyString s(How are you?);if(How=s)cout两字符串比较结果:equalendl;elsecout两字符串比较结果:unequalendl;return 0;,2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 重载

链接地址:https://www.31ppt.com/p-6350464.html