已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
运算符重载运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。1 运算符重载为成员函数 AX+ 运算符重载实质上是函数的重载,重载运算符的函数一般格式如下:函数类型 operator 运算符名称(形参表列)对运算符的重载处理例如,想将“+”用于Complex(复数)的加法运算,函数的原型可以是这样的:Complex operator + (Complex & c1,Complex &c2);其中,operator是关键字,是专门用于定义重载运算符的函数的,运算符名称就是C+提供给用户的预定运算符。 注意:函数名是由operator和运算符组成。上面的operator+就是函数名,意思是“对运算符+重载“。只要掌握这点,这可以发现,这类函数和其他函数在形式上没有什么区别。两个形参是Complex类对象的引用,要求实参为Complex类对象。在定义了重载运算符后,可以说:函数operator+重载了运算符+。在执行复数相加的表达式c1+c2时(假设c1+c2都已被定义为Complex),系统就会调用operator+函数,把c1+c2作为实参,与形参进行虚实结合。为了说明把运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想象称为调用下面的函数:代码如下:int operator + (int a, int b) return (a+b); 如果有表达式5+8,就调用此函数,将5和8作为调用函数时的形参,函数的返回值为13,这就是通过函数的方法理解运算符。例1:运算符重载实现两个坐标点的加运算class Point int x, y;public:Point() Point (int I, int j) x=i; y=j;void disp() cout “(“ x ”,”y”)”endl;Point operator+ (Point &p) return Point(x+p.x, y+p.y);void main() Point p1(3,4), p2(2,9), p3;p3=p1+p2;p3.disp(); 例2:运算符重载实现复数的加、减、乘、除和赋值运算。/examplech707.cpp#include #include class Complex /复数类public:Complex(double r=0.0,double i=0.0)Real=r;Imag=i; double GetReal()return Real; /返回复数的实部double GetImag()return Imag; /返回复数的虚部Complex operator+(Complex &c); /复数加复数Complex operator+(double d); /复数加实数Complex operator-(Complex &c); /复数减复数Complex operator*(Complex &c);Complex operator/(Complex &c);Complex operator=(Complex x); /复数对象=复数void display();private:double Real, Imag; /私有数据成员; /Complex c1(3,5), c2(2,7), c3; c3=c1-c2;void Complex:display() coutReal+jImagendl; Complex Complex:operator+(Complex &c) /重载运算符+,两个复数相加Complex temp;temp.Real=Real+c.Real; /实部相加temp.Imag=Imag+c.Imag; /虚部相加return temp;Complex Complex:operator +(double d) /重载运算符+,一个复数加一个实数Complex temp;temp.Real=Real+d;temp.Imag=Imag;return temp;Complex Complex:operator-(Complex &c) /重载运算符-,两个复数相减 /c1-c2Complex 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-Imag*c.Imag;temp.Imag=Real*c.Imag+Imag*c.Real;return temp;Complex Complex:operator /(Complex &c) /重载运算符/,两个复数相除Complex temp;double abs;abs=sqrt(c.Real*c.Real+c.Imag*c.Imag);temp.Real=(Real*c.Real+Imag*c.Imag)/abs;temp.Imag=(-Real*c.Imag+Imag*c.Real)/abs;return temp;Complex Complex:operator=(Complex c) /重载运算符=Real=c.Real;Imag=c.Imag;return* this; /*this表示当前对象void Complex:display()coutReal+jImagendl;void main()Complex c1(12,13),c2(13,16),c3,c4,c5,c6,c7; /定义复数类的对象coutc1=;c1.display();coutc2=;c2.display();c3=c1+(c2+c3); /调用运算符+、=重载函数,完成复数加复数coutc3=c1+c2=;c3.display();c4=c3+18.5; /调用运算符+、=重载函数,完成复数加实数coutc4=c3+18.5=;c4.display();c5=c2-c1; /调用运算符-、=重载函数,完成复数减复数coutc5=c2-c1=;c5.display();c6=c1*c2; /调用运算符*、=重载函数,完成复数乘法coutc5=c1*c2=;c6.display();c7=c2/c1; /调用运算符/、=重载函数,完成复数除法coutc7=c2/c1=;c7.display();例3:“+”重载成字符串的连接, s1=”hello”, s2=” shanghai”, s1+s2=”hello shanghai”#include #include class String public:String(char* str) strcpy(ch, str);String() String() String operator+(String&); /“+”运算符重载为成员函数void Display()coutchendl;private:char ch256;static char *str;String String:operator+(String &a)strcpy(str, ch);return strcat(str,a.ch);void main() str = new char256;String ch1(哈佛大学);String ch2(是美国著名大学);String ch3=ch1+ch2;ch3.Display();delete str;作业:“+”重载成字符串的复制, s=”hello”, s+=”hellohello”2 运算符重载为友元函数友元函数通过类的对象可以访问类所有成员。所以运算符重载为类的友元函数以后也可以访问类的所有成员。 与运算符重载为成员函数时不同的是,重载的友元函数不属于任何类,运算符 所需的操作数都需要通过函数的形参来传递。在形参表中从左到右的顺序就是用运算符操作数的顺序。 这里也分双目运算符和单目运算符两种情况讨论运算符重载为友元函数的具体方式。如果有双目运算符U,它的其中一个操作数是类A的对象a,那么运算符U就可以重载为类A的友元函数,此友元函数的两个参数中,一个是类A的对象,另一个是其他对象,也可以是类A的对象。这样双目运算符重载为类的友元函数后,假设运算符的另一个操作数是对象b,则表达式a U b就相当于调用函数operator U(a, b)。下面再讨论单目运算符的重载。如果有前置单目运算符U,比如前置“-”,a为类A的对象,我们想实现U a这样的运算,就可以把U重载为类A的友元函数,此友元函数只有一个形参,为类A的对象,重载后表达式U a相当于调用函数operator U(a)。如果是后置单目运算符U,如后置“+”,a还是类A的对象,那么要实现a U这样的运算,也可以把U重载为类A的友元函数,此时友元函数就需要有两个形参,一个是类A的对象,另一个是整型形参,此整型形参没有实际意义,与上一节后置单目运算符重载为成员函数时的整型形参一样,只是为了区分前置运算符和后置运算符的重载。重载后表达式a U就相当于调用函数operator U(a, 0)。例4:实数加复数运算符重载为友元函数形式。/examplech710.cpp#include class Complex public:Complex (double r=0,double i=0):Real(r),Imag(i) /初始化列表double GetReal()return Real;double GetImag()return Imag;Complex operator+(double);Complex operator=(Complex);friend Complex operator +(double, Complex&);/友元函数 void display(); /输出函数private: double Real;double Imag;Complex Complex:operator+(double d) Complex temp;temp.Real=Real+d;temp.Imag=Imag;return temp;Complex Complex:operator=(Complex c)Real=c.Real;Imag=c.Imag;return *this;Complex operator+(double d, Complex &c) /普通函数Complex temp;temp.Real = d+c.Real;temp.Imag
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025重庆市涪陵区南沱镇人民政府选聘本土人才4人备考题库附答案解析
- 2025江西省旅游集团海外旅游有限责任公司司机岗招聘备考题库附答案解析
- 2025山西大同市消防救援支队面向社会招录政府专职消防员116人笔试模拟试卷带答案解析
- 2025云南西双版纳州检察机关招聘聘用制书记员5人历年真题汇编带答案解析
- 2025中铁建公路运营公司所属单位招聘15人备考公基题库附答案解析
- 2025华夏银行成都分行社会招聘(11月)历年真题汇编带答案解析
- 贵州国企招聘:2025息烽县城市维护建设发展有限公司选聘备考题库带答案解析
- 2025福建省鹭松水务有限公司招聘2人备考题库带答案解析
- 2025年中国科学技术大学人文与社会科学学院劳务派遣岗位招聘1人备考公基题库带答案解析
- 2025河北建工雄安建设发展有限公司社会招聘参考题库附答案解析
- 体育用品供货运输方案及保障措施
- 内河港口船舶充电站技术要求
- 畸胎瘤护理诊断
- 深静脉血栓的护理个案
- 小流域综合治理项目实施方案编写提纲(试行)
- 2025年南京市社区工作者招聘考试试卷
- 漂流旅游安全管理制度
- 润滑油代加工合同范本
- 2024急危重症患者手术护理专家共识解读
- 《临床急救技能培训》课件
- 健康产业园区建设与发展策略研究
评论
0/150
提交评论