




已阅读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年经济师初级考试 经济基础知识核心考点模拟试卷
- 贵州省茶产业发展现状研究
- 其他收入分享协议的注意事项
- 2025年北京市纪委市监委所属事业单位招聘8人笔试备考题库参考答案详解
- 物流公司驾驶员管理的规章制度
- 【MOOC】大学物理-电磁学-北京理工大学 中国大学慕课MOOC答案
- 35KV集电线路安全施工措施
- 机场监控施工方案
- 北京餐厨垃圾收运合同范本
- 压力容器使用单位安全员题库
- 3输变电工程施工质量验收统一表式(变电工程电气专业)-2024年版
- 大数据产业大数据应用技术创新与实践计划
- 动物疫病检测合同
- 2024-2029年中国汾酒行业供需分析及发展前景研究报告
- 装配式结构吊装施工计算书
评论
0/150
提交评论