版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
*运算符重载为友元函数运算符也可以重载为类的友元函数,这样它就可以自由地访问该类的任何数据成员。这时,运算所需要的操作数都需要通过函数的形参表来传递,在参数表中形参从左到右的顺序就是运算符操作数的顺序。但是,有些运算符不能重载为友元,如“=”、“()”、“[]”和“->”。运算符重载为友元
1.双目运算:oprdlBoprd2
对于双目运算符B,如果oprdl为A类的对象,则应当把B重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。经过重载之后,表达式oprdlBoprd2就相当于函数调用operatorB(oprdl,oprd2)。
运算符重载为友元函数名2.单目运算
1)前置单目运算:Uoprd
对于前置单目运算符U,如“-”(负号)等,如果要实现表达式Uoprd(其中oprd为A类的对象),则U可以重载为A类的友元函数,函数的形参为A类的对象。经过重载之后,表达式Uoprd相当于函数调用operatorU(oprd)。运算符重载为友元2)后置单目运算:oprdV
对于后置运算符V,如“++”和“--”,如果要实现表达式oprd++或oprd--(其中oprd为A类的对象),那么运算符就可以重载为A类的友元函数,这时函数的形参有两个,一个是A类的对象oprd,另一个是整型(int)形参。重载之后,表达式oprd++和oprd--就相当于函数调用operator++(oprd,0)和operator--(oprd,0)。运算符重载为友元【例3】双目运算符重载为友元重载例题。#include<iostream.h>classpoint{private: floatx,y;运算符重载为友元运算符重载为友元public:point(floatxx=0,floatyy=0){x=xx;y=yy;}floatget_x(){returnx;}floatget_y(){returny;}
friendpointoperator+(pointp1,pointp2);//重载运算符“+”friendpointoperator-(pointp1,pointp2);//和“-”为友元函数};
pointoperator+(pointp1,pointp2){returnpoint(p1.x+p2.x,p1.y+p2.y);}pointoperator-(pointp1,pointp2){ returnpoint(p1.x-p2.x,p1.y-p2.y);}运算符重载为友元voidmain(){pointp1(3,3),p2(2,2),p3,p4;p3=p1+p2;//两点相加p4=p1-p2;//两点相减cout<<p3.get_x()<<""<<p3.get_y()<<endl;cout<<p4.get_x()<<""<<p4.get_y()<<endl;}运算符重载为友元练习、定义一个复数类complex,重载运算符“+”,使之能用于复数的加法运算,参加运算的两个运算量可以都是复数类对象,也可以其中有一个是整数,顺序任意。例如:c1+c2,c1+i,i+c1,c1+=c2均合法,编程:分别求两个复数之和,整数和复数之和。运算符重载赋值运算符“=”的重载对任一类X,如果没有用户自定义的赋值运算符函数,那么系统自动地为其生成一个缺省的赋值运算符函数,定义为类X中的成员到成员的赋值,例如:
X&X::operator=(constX&source){//…成员间赋值
}
若obj1和obj2是类X的两个对象,obj2已被创建,则编译程序遇到如下语句:
obj1=obj2;
就调用缺省的赋值运算符函数,将对象obj2的数据成员的值逐个赋给对象obj1的对应数据成员中。
赋值运算符“=”的重载1.指针悬挂问题在某些特殊情况下,如类中有指针类型时,使用缺省的赋值运算符函数会产生错误。例使用缺省的赋值运算符函数产生错误的例子。
#include<iostream.h>#include<string.h>classstring{
赋值运算符“=”的重载public:string(char*s){ptr=newchar[strlen(s)+1];strcpy(ptr,s);}~string(){deleteptr;}voidprint(){cout<<ptr<<endl;}
赋值运算符“=”的重载private:char*ptr;};voidmain(){stringp1(“book”),p2("pen");p1=p2;cout<<"p2:";p2.print();cout<<"p1:";p1.print();}
赋值运算符“=”的重载2.重载赋值运算符解决指针悬挂问题为了解决上述使用缺省的赋值运算符所遇到的指针悬挂问题,必须重载赋值运算符,使得对目标对象数据成员指针的赋值,是把原对象指针ptr所指向的内容传递给它,而不是简单地传递指针值。
赋值运算符“=”的重载例:重载赋值运算符解决指针悬挂问题。
#include<iostream.h>#include<string.h>classstring{private:char*ptr;
赋值运算符“=”的重载public:string(char*s){ptr=newchar[strlen(s)+1];strcpy(ptr,s);}~string(){deleteptr;}voidprint(){cout<<ptr<<endl;}};
赋值运算符“=”的重载
string&operator=(conststring&s){if(this==&s)return*this;//防止s=s的赋值
deleteptr;//释放掉原区域
ptr=newchar[strlen(s.ptr)+1];//分配新区域
strcpy(ptr,s.ptr);//字符串拷贝
return*this;}
赋值运算符“=”的重载voidmain(){stringp1("book");stringp2("pen");p1=p2;cout<<"p2:";p2.print();cout<<"p1:";p1.print();}
赋值运算符“=”的重载
*其它运算符重载①比较运算符重载(如<,>,<=,>=,==,!=)。②赋值运算符重载(如=,+=,-=,*=,/=)。③下标运算符“[]”重载。下标运算符“[]”通常用于取数组中的某个元素,通过下标运算符重载,可以实现数组下标的越界检测等。
运算符重载④运算符new和delete重载。通过重载new和delete,可以克服new和delete的不足,使其按要求完成对内存的管理。⑤逗号运算符“,”重载。逗号运算符构成的表达式为“左操作数,右操作数”,该表达式返回右操作数的值。运算符重载*流运算符<<和>>的重载C++的流插入运算符“<<”和流提取运算符”>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream。cin和cout分别是istream类和ostream类的对象。在类库提供的头文件中已经对“<<”和“>>”进行了重载,使之作为流插入运算符和流提取运算符,能用来输入和输出C++标准类型的数据。因此,凡是用到“cin>>”和“cout<<”的地方都要用
#include<iostream.h>将头文件包含到本程序文件中。流运算符的重载用户自定义的类型的数据(如:程序中需要输入和输出复数类的对象),是不能直接用“<<”和“>>”来输入和输出的,如果想用它们来输入和输出自己声明的类型的数据,就必须要对它们进行重载。
思考:对插入“<<”和提取”>>”运算符的重载定义成一个类的成员函数还是类的友元函数。流运算符的重载因为这两个操作符的左边是流而不是被操作的对象,因此对它们只能够重载为友元函数。*插入运算符重载的一般形式:
ostream&operator<<(ostream&函数的流,类名&对象名){……//函数代码
return函数的流;}流运算符的重载*提取运算符重载的一般形式:istream&operator>>(istream&函数的流,类名&对象名){……//函数代码return函数的流;}流运算符的重载例:对用户自定义类型(复数类complex)的对象进行输入和输出。#include<iostream.h>classcomplex{doublereal;doubleimag;
流运算符的重载public:friendostream&operator<<(ostream&out,complex&a);friendistream&operator>>(istream&in,complex&b);};流运算符的重载istream&operator>>(istream&in,complex&b){cout<<"inputrealpartandimagpartofcomplexnumber:";in>>b.real>>b.imag;returnin;}流运算符的重载ostream&operator<<(ostream&out,complex&a){out<<"("<<a.real<<","<<a.imag<<"i)";returnout;}流运算符的重载intmain(){complexc1,c2;cin>>c1>>c2;cout<<"c1="<<c1<<endl;cout<<"c2="<<c2<<endl;return0;}流运算符的重载运行结果:inputrealpartandimagpartofcomplexnumber:36
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度个人医疗贷款债权转让与健康管理服务合同3篇
- 2025年度个人住宅门窗安全性能提升合同4篇
- 2025年微信公众号社群运营与粉丝增长合同3篇
- 2025年度绿色建筑评估个人工程居间合同范本下载3篇
- 二零二五年度绿色环保型门店租赁合同范本4篇
- 2024年高新技术园区投资借款合同模板3篇
- 二零二五年度棉布产品绿色认证与推广服务合同4篇
- 2025年食品加工厂厨师劳务派遣合同模板4篇
- 2025年新型大棚建设与租赁合作合同4篇
- 2025年度生态渔业承包合同3篇
- 春节行车安全常识普及
- 电机维护保养专题培训课件
- 汽车租赁行业利润分析
- 春节拜年的由来习俗来历故事
- 2021火灾高危单位消防安全评估导则
- 佛山市服务业发展五年规划(2021-2025年)
- 房屋拆除工程监理规划
- 医院保安服务方案(技术方案)
- 高效能人士的七个习惯:实践应用课程:高级版
- 小数加减法计算题100道
- 通信电子线路(哈尔滨工程大学)智慧树知到课后章节答案2023年下哈尔滨工程大学
评论
0/150
提交评论