青岛理工大学c++课件oopc6-2

上传人:第*** 文档编号:54419175 上传时间:2018-09-12 格式:PPT 页数:30 大小:117KB
返回 下载 相关 举报
青岛理工大学c++课件oopc6-2_第1页
第1页 / 共30页
青岛理工大学c++课件oopc6-2_第2页
第2页 / 共30页
青岛理工大学c++课件oopc6-2_第3页
第3页 / 共30页
青岛理工大学c++课件oopc6-2_第4页
第4页 / 共30页
青岛理工大学c++课件oopc6-2_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《青岛理工大学c++课件oopc6-2》由会员分享,可在线阅读,更多相关《青岛理工大学c++课件oopc6-2(30页珍藏版)》请在金锄头文库上搜索。

1、第6章 多态与虚函数,运算符重载,Some questions,Why do we overload operator? How do we overload operators? What operators can we overload? What should an operator overloading return? What restrictions are there on operator overloading? What operator behavior can we NOT change? Where do the operands for operator ove

2、rloading appear? How many parameters must my overloading operator function have?,class Complex private: float Real; float Imag; public: Complex( ) Real=0;Imag=0; Complex (float Re,float Im) Real=Re; Imag=Im; Complex Add(const Complex ,inline Complex Complex:Add(const Complex /8+7i ,c=c1+c2; / c=c2+c

3、1;,1.运算符重载的规则,Keyword operator 加上运算符 构成函数名 运算符可以重载为 成员函数 普通函数 友元函数 只能重载存在的运算符;其中5个不能重载:. ; * ; : ; sizeof() ; ?:,重载之后的运算符的优先级和结合性都不会改变。 不能改变原运算符操作数的个数,如C+语言中的“”是一个单目运算符,只能有一个操作数。,运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造,不能改变运算符对预定义类型数据的操作方式。从这条规定可知,重载运算符时必须至少有一个自定义类型的数据(即对象)作为操作数。,2.运算符重载为成员函数,如果是单目运算符,函数的参

4、数为空。 如果是双目运算符,参数表中有一个参数。 对于双目运算符D,如果要重载为类X的成员函数,实现表达式xobj1 D xobj2,则函数只有一个形参,形参的类型是xobj2所属的类型,经过重载后,表达式xobj1 D xobj2相当于函数调用xobj1.operator D(xobj2)。,【例6-10】 用成员函数形式实现复数类加减法运算符重载。,#include using namespace std; class Complex private: float Real; float Imag; public: Complex() Real=0;Imag=0; Complex(floa

5、t Re,float Im) Real=Re;Imag=Im; Complex operator+(Complex c); /运算符“+”重载成员函数 Complex operator-(Complex c); /运算符“-”重载成员函数 void display(); ;,Complex Complex:operator +(Complex c) return Complex(Real+c.Real,Imag+c.Imag); Complex Complex:operator-(Complex c) return Complex(Real-c.Real,Imag-c.Imag); void

6、Complex:display() cout“(“Real“,“Imag“)“endl; void main() Complex c1(5.0,10.0),c2(3.0,-2.5),c3; /定义复数类对象 cout“c1=“;c1.display(); cout“c2=“;c2.display(); c3=c1+c2; /用重载运算符实现复数加法 cout“c3=c1+c2“; c3.display(); c3=c1-c2 ; /用重载运算符实现复数减法 cout=0 ,Clock Clock: operator+(int) Clock h(Hour,Minute,Second); Seco

7、nd+; if(Second=60) Second-=60; Minute+; if(Minute=60) Minute-=60;Hour+;Hour%=24; return h; void main() Clock clock(23,59,59),c; /定义时钟对象 cout“First time:“;clock.ShowTime(); +clock; cout“+clock:“; clock.ShowTime(); c=clock+; cout“clock+:“; c.ShowTime(); cout“colck:“; clock.ShowTime(); ,程序运行结果: First t

8、ime:23:59:59 +clock:0:0:0 clock+:0:0:0 colck:0:01,3.运算符重载为友元函数,运算符也可以重载为类的友元函数,这样,它就可以访问该类中的任何数据成员。这时,运算符所需要的操作数都需要通过函数的参数表来传递,在参数表中形参从左到右的顺序就是运算符操作数的顺序。 对于双目运算符D,如果要重载为类X的友元函数,实现表达式xobj1 D xobj2,则函数有两个形参,其中xobj1和xobj2是类X的对象,经过重载后,表达式xobj1 D xobj2相当于函数调用operator D(xobj1,xobj2)。,【例6-12】 用友元函数实现分数类的相加

9、、相等运算。,#include #include using namespace std; class Franc private: int nume; int deno; public: Franc() Franc(int nu,int de) if(de=0) cerr“除数为零!”endl; exit(1); /终止程序运行,返回C+主操作窗口 nume=nu;deno=de; ,friend Franc operator+(Franc f1,Franc f2); /运算符“+”重载友元函数 friend bool operator=(Franc f1,Franc f2);/运算符“=”

10、重载友元函数void FranSimp(); void display(); ; void Franc:display() cout“(“nume“/“deno“)“endl; /输出分数 void Franc:FranSimp() /化简为最简分数 /求x分数的分子和分母的最大公约数 int m,n,r; m=nume;n=deno; r=m%n; while(r!=0) m=n;n=r; r=m%n; ,if(n!=0) /化简为最简分式 nume/=n; deno/=n; if(deno0) /分母为负时处理 nume=-nume; deno=-deno; ,Franc operator

11、+(Franc f1,Franc f2) Franc f; f.nume=f1.nume*f2.deno+f2.nume*f1.deno; /计算结果分数的分子 f.deno=f1.deno*f2.deno; /计算结果分数的分母 f.FranSimp(); /对结果进行简化处理 return f; /返回结果分数 bool operator=(Franc f1,Franc f2) if(f1.nume*f2.deno=f2.nume*f1.deno) return true; else return false; ,int main() Franc f1(5,6),f2(1,-2),f3;

12、/定义分数类对象 cout“f1=“;f1.display(); cout“f2=“;f2.display(); f3=f1+f2; /用重载运算符实现分数加法 cout“f1+f2=“f3.display( ); if(f1=f2) cout“f1和f2相等“endl; /判断f1和f2是否相等 else cout“f1和f2不相等“c; cincc1;,c=c1+c2;/=用不用重载?,提示: The assignment operator(=) 在需要重载时必须被重载成类的成员函数,不能是类的友元函数。 在类的数据成员中含有指针成员时,一般必须重载operator=,同时必须显式定义拷贝构造函数和析构函数。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号