首页 运算符重载

运算符重载

举报
开通vip

运算符重载第7章运算符重载7.1运算符重载概述7.2运算符函数重载为类的友元函数和成员函数7.3几个常用运算符的重载7.4重载插入运算符和提取运算符7.5类型转换本章主要内容7.1运算符重载概述用于完成“+〞、“-〞、“*〞、“\〞等操作的函数为运算符函数。C++规定运算符函数名为:operator+operator-operator*operator\等统称为:operator@(@--要重载的运算符)运算符函数名两个或者两个以上的运算符函数共用一个运算符函数名为运算符函数重载。C++系统已经预先编好了将两个根本数据类型相...

运算符重载
第7章运算符重载7.1运算符重载概述7.2运算符函数重载为类的友元函数和成员函数7.3几个常用运算符的重载7.4重载插入运算符和提取运算符7.5类型转换本章主要内容7.1运算符重载概述用于完成“+〞、“-〞、“*〞、“\〞等操作的函数为运算符函数。C++规定运算符函数名为:operator+operator-operator*operator\等统称为:operator@(@--要重载的运算符)运算符函数名两个或者两个以上的运算符函数共用一个运算符函数名为运算符函数重载。C++系统已经预先编好了将两个根本数据类型相加的的运算符函数,可以直接使用它们。1.求两个整数相加,例如:inti=2+3;2.求两个双精度数相加,例如:doubled=2.222+3.333;运算符函数重载调用预先编好的将两个整型数相加的的运算符函数调用预先编好的将两个双精度数相加的的运算符函数C++系统预先编好的运算符函数不能完成将两个对象的相加工作。例如:有一个复数类complex:classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}};实现两个对象相加的运算符函数假设要把类complex的两个对象com1和com2加在一起:intmain(){,2.2),,4.4);complextotal;total=com1+com2;//错误//…return0;}C++系统预先编好的运算符函数不能将两个对象的相加解决方法:用户自己编写一个实现两个对象相加的运算符函数,例如:intmain(),2.2),,4.4);complextotal;total=com1+com2;//…return0;}就能将类complex的两个对象com1和com2相加complexoperator+(complexco1,complexco2){…}将类complex的两个对象相加的运算符函数operator+():complexoperator+(complexco1,complexco2){complextemp;;;returntemp;}调用语句:total=operator+(com1,com2);或:total=com1+com2;就能将类complex的两个对象com1和com2相加例7.1-1将两个complex类对象相加的完整程序。#includeusingnamespacestd;classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}};complexoperator+(complexco1,complexco2){complextemp;temp.real=co1.real+co2.real;temp.imag=co1.imag+co2.imag;returntemp;}运算符函数operator+()main(){complexcom1(1.1,2.2),com2(3.3,4.4),total1,total2;total1=operator+(com1,com2);cout<<"real1="<classcomplex{public:doublereal,imag;complex(doubler=0,doublei=0){real=r;imag=i;}};complexoperator+(complexco1,complexco2){complextemp;temp.real=co1.real+co2.real;temp.imag=co1.imag+co2.imag;returntemp;}运算符函数operator+()例7.1-1是一个类外定义的运算符函数,只能访问公有数据成员,而不能访问类的私有数据成员。公有的数据成员例存在的问题但是,实际上类中的数据成员常常是私有成员或保护成员解决方法:(1)定义为它将要操作的类的成员函数(简称为成员运算符重载函数);(2)定义为它将要操作的类的友元函数(简称为友元运算符重载函数)。7.2运算符函数重载为类的友元函数和成员函数7.2.1友元运算符重载函数7.2.2成员运算符重载函数7.2.3运算符重载应该注意的几个问题本节主要内容7.2.1友元运算符重载函数在C++中,可以把运算符函数定义成某个类的友元函数,称为友元运算符重载函数。1.友元运算符重载函数定义的语法形式(1)在类的内部,定义友元运算符重载函数的格式如下:friend 函数类型operator运算符(形参 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf ){函数体}(2)友元运算符重载函数也可以在类中声明友元函数的原型,在类外定义。在类中,声明友元运算符重载函数原型的格式如下:在类外,定义友元运算符重载函数的格式如下:classX{…friend函数类型operator运算符(形参表);…};函数类型operator运算符(形参表){函数体}例如:两个complex对象进行“+〞法运算的友元运算符函数。classcomplex{friendcomplexoperator+(complexco1,complexco2);//...};complexoperator+(complexco1,complexco2){//...}在类的内部声明原型在类外定义友元运算符函数友元运算符函数定义时:假设重载的是双目运算符,那么参数表中有两个操作数;假设重载的是单目运算符,那么参数表中只有一个操作数。2.双目友元运算符重载函数双目运算符有两个操作数,通常在运算符的左右两侧,例如:3+5,24>12当用友元函数重载双目运算符时,两个操作数都要传递给运算符重载函数。#include//例classcomplex{doublereal,imag;public:friendcomplexoperator+(complexco1,complexco2);complex(doubler=0,doublei=0){real=r;imag=i;}voidprint(){cout<<"real="<usingnamespacestd;修改成#include例如:例中的:#includeclasscomplex{doublereal,imag;public:friendcomplexoperator+(complexco1,complexco2);complex(doubler=0,doublei=0){real=r;imag=i;}voidprint(){cout<<"real="<usingnamespacestd;3.单目友元运算符重载函数单目运算符只有一个操作数,例如:-a,&b,!c,++p用友元函数重载单目运算符时,需要一个显式的操作数。#include//例classAB{inta,b;public:AB(intx=0,inty=0){a=x;b=y;}friendABoperator-(ABobj);voidshow();};ABoperator-(ABobj){obj.a=-obj.a;obj.b=-obj.b;returnobj;}voidAB::show(){cout<<"a="<//例classAB{inta,b;public:AB(intx=0,inty=0){a=x;b=y;}friendABoperator-(ABobj);voidshow();};ABoperator-(ABobj){obj.a=-obj.a;obj.b=-obj.b;returnobj;}voidAB::show(){cout<<"a="<//例classcoord{intx,y;public:coord(inti=0,intj=0);voidprint();friendcoordoperator++(coordop);};coord::coord(inti,intj){x=i;y=j;}voidcoord::print(){cout<<"x:"<//例classcoord{intx,y;public:coord(inti=0,intj=0);voidprint();friendcoordoperator++(coordop);};coord::coord(inti,intj){x=i;y=j;}voidcoord::print(){cout<<"x:"<//例classcoord{intx,y;public:coord(inti=0,intj=0);voidprint();friendcoordoperator++(coord&op);};coord::coord(inti,intj){x=i;y=j;}voidcoord::print(){cout<<"x:"<real+c.real;temp.imag=this->imag+c.imag;returntemp;}显式调用A3=A1.operator+(A2);隐式调用A3=A1+A2;以上两个语句的执行结果是完全相同的。隐含的左操作数右操作数complexcomplex::operator+(complexc){complextemp;temp.real=this->real+c.real;temp.imag=this->imag+c.imag;returntemp;}显式调用A3=A1.operator+(A2);隐式调用A3=A1+A2;以上两个语句的执行结果是完全相同的。隐含的左操作数右操作数#include//例classcomplex{doublereal,imag;public:complex(doubler=0,doublei=0){real=r;imag=i;}complexoperator+(complexco2);voidprint(){cout<<"real="<//例classcoord{intx,y;public:coord(inti=0,intj=0);voidprint();coordoperator++();};coord::coord(inti,intj){x=i;y=j;}voidcoord::print(){cout<<"x:"<〞只能作为成员函数;·对于运算符“+=、-=、/=、*=、&=、!=、~=、%=、<<=、>>=〞,建议重载为成员函数;·对于其他运算符,建议重载为友元函数。(10)双目运算符一般可以被重载为友元运算符重载函数或成员运算符重载函数,但有一种情况,必须使用友元函数。#include//例classAB{inta,b;public:AB(intm=0,intn=0);ABoperator+(intx);//声明成员运算符函数voidshow();};AB::AB(intx,inty){a=x;b=y;}ABAB::operator+(intx)//定义成员运算符函数{ABtemp;temp.a=a+x;temp.b=b+x;returntemp;}voidAB::show(){cout<<"a="<//例classAB{inta,b;public:AB(intm=0,intn=0);ABoperator+(intx);//声明成员运算符函数voidshow();};AB::AB(intx,inty){a=x;b=y;}ABAB::operator+(intx)//定义成员运算符函数{ABtemp;temp.a=a+x;temp.b=b+x;returntemp;}voidAB::show(){cout<<"a="<//例classAB{inta,b;public:AB(intx=0,inty=0);friendABoperator+(ABob,intx);friendABoperator+(intx,ABob);voidshow();};AB::AB(intx,inty){a=x;b=y;}ABoperator+(ABob,intx){ABtemp;temp.a=ob.a+x;temp.b=ob.b+x;returntemp;}ABoperator+(intx,ABob){ABtemp;temp.a=x+ob.a;temp.b=x+ob.b;returntemp;}voidAB::show(){cout<<"a="<//例classover{inti1;public:voidinit(intI1);voidprint();overoperator++();overoperator++(int);};voidover::init(intI1){i1=I1;}voidover::print()//显示输出数据成员{cout<<"i1:"<//例classover{inti1;public:voidinit(intI1);voidprint();friendoveroperator--(over&);friendoveroperator--(over&,int);};voidover::init(intI1){i1=I1;}voidover::print()//显示输出数据成员{cout<<"i1:"<//例usingnamespacestd;classSTRING{public:STRING(char*s){cout<<"Constructorcalled."< ppt 关于艾滋病ppt课件精益管理ppt下载地图下载ppt可编辑假如ppt教学课件下载triz基础知识ppt rp1ptrp2(a)执行p2=p1之前bookptrptrp1p2(b)执行p2=p1之后jeepptr?(c)撤销对象p2后图5.1例的浅层复制示意图p1Lin调用了默认的赋值运算符函数,程序运行后,出现了所谓的“指针悬挂〞现象。2.用深层复制解决指针悬挂问题为了解决浅层复制出现的错误,必须显式地定义一个赋值运算符重载函数,使之不但拷贝数据成员,而且为对象p1和p2分配了各自的内存空间,这就是所谓的深层复制。#include//例7.11关于深层复制的例子。usingnamespacestd;classSTRING{public:STRING(char*s){cout<<"Constructorcalled."<//例#includeclassVector4{intv[4];public:Vector4(inta1,inta2,inta3,inta4){v[0]=a1;v[1]=a2;v[2]=a3;v[3]=a4;}int&operator[](intbi);};int&Vector4::operator[](intbi){if(bi<0||bi>=4){cout<<"Badsubscript!\n";exit(1);}returnv[bi];}voidmain(){Vector4v(1,2,3,4);cout<//例7.14classMatrix{int*m;introw,col;public:Matrix(int,int);int&operator()(int,int);};Matrix::Matrix(introw,intcol){this->row=row;this->col=col;m=newint[row*col];for(inti=0;iusingnamespacestd;classMyclass{public:Myclass(intx=0,doubley=0){i=x;j=y;}Myclassoperator()(intk,doublem);voiddisplay(){cout<>〞本节主要内容7.4.1重载插入运算符“<<〞在头文件iostream中,对运算符“<<〞进行重载,能用它输出各种标准类型的数据,其原型具有形式:例如当系统执行cout<<″Thisisastring.\n″;时,就调用了插入运算符重载函数ostream&operator<<(ostream&char*);以上语句相当于cout.operator<<(″Thisisastring.\n″);ostream&operator<<(ostream&类型名);它的功能是将字符串“Thisisastring.〞插入到流对象cout中。于是在显示器屏幕上显示出字符串″Thisisastring.″。类型名是指int、float、double、char*、char等C++标准类型。C++对插入运算符“<<〞的功能进行了扩充,可以实现用户自定义类型的输出。定义插入运算符“<<〞重载函数的一般格式如下:函数中第一个参数是对ostream对象的引用,这意味着out必须是输出流,它可以是其他标识符,但必须与return后面的标识符相同。ostream&operator<<(ostream&out,自定义类名&obj){out<usingnamespacestd;classComplex{声明复数类Complexpublic:Complex(doubler=0.0,doublei=0.0);//声明构造函数friendComplexoperator+(Complex&a,Complex&b);//声明运算符"+"重载为友元函数friendostream&operator<<(ostream&,Complex&);//声明运算符"<<"重载为友元函数private:doublereal;//复数实部doubleimag;//复数虚部};Complex::Complex(doubler,doublei)//定义构造函数{real=r;imag=i;}Complexoperator+(Complex&a,Complex&b){Complextemp;//定义运算符"+"重载函数temp.real=a.real+b.real;temp.imag=a.imag+b.imag;returntemp;}ostream&operator<<(ostream&out,Complex&com){out<0)out<<"+";if(com.imag!=0)out<>〞在头文件iostream中,对运算符“>>〞进行重载,以便能用它输入各种标准类型的数据,其原型具有形式:例如当系统执行intx;cin>>x;时,就调用了提取运算符重载函数istream&operator>>(istream&int&);从输入流对象cin(通常为键盘)读入一个值并赋给x。istream&operator>>(istream&类型名&);其中,类型名也是指int、float、double、char*、char等C++标准类型。C++对提取运算符“>>〞的功能进行了扩充,可以通过重载运算符“>>〞实现用户自定义类型的输入。完整的格式如下:函数中第一个参数in是istream类对象的引用。这意味着in必须是输入流对象,它可以是其他任何正确的标识符,但必须与return后面的标识符相同。istream&operator>>(istream&in,自定义类名&obj){in>>obj.item1;in>>obj.item2;…in>>obj.itemn;returnin;}对istream对象的引用两者应该一致例将运算符函数重载为友元函数,用于进行复数的加法运算,并用重载运算符“>>〞输入复数,用重载的运算符“<<〞输出复数。#includeusingnamespacestd;classComplex{public:Complex(doubler,doublei){real=r;imag=i;}Complex(){real=0;imag=0;}friendComplexoperator+(Complex,Complex);friendostream&operator<<(ostream&,Complex&);friendistream&operator>>(istream&,Complex&);private:doublereal,imag;};在环境下运行时,第1行应改为:#include,并将第2行删去。Complexoperator+(Complexa,Complexb){//定义重载"+"的运算符函数Complextemp;temp.real=a.real+b.real;temp.imag=a.imag+b.imag;returntemp;}ostream&operator<<(ostream&output,Complex&obj){//定义重载"<<"的运算符函数output<0)output<<"+";if(obj.imag!=0)output<>(istream&input,Complex&obj){//定义重载">>"的运算符函数cout<<"请输入复数实部和虚部的值:"<>obj.real;input>>obj.imag;returninput;}intmain(){Complexc1(2.4,4.6),c2,c3;cout<<"复数c1的值是:"<>c2;cout<<"复数c2的值是:"<//例classcomplex{doublereal,imag;public:complex(doubler,doublei){real=r;imag=i;}complex(doubler){real=r;imag=r;}
本文档为【运算符重载】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥12.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
chenxinlong
暂无简介~
格式:ppt
大小:902KB
软件:PowerPoint
页数:108
分类:
上传时间:2021-11-24
浏览量:1