资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第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 overloading 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+c1;,1.运算符重载的规则,Keyword operator 加上运算符 构成函数名 运算符可以重载为 成员函数 普通函数 友元函数 只能重载存在的运算符;其中5个不能重载:. ; * ; : ; sizeof() ; ?:,重载之后的运算符的优先级和结合性都不会改变。 不能改变原运算符操作数的个数,如C+语言中的“”是一个单目运算符,只能有一个操作数。,运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造,不能改变运算符对预定义类型数据的操作方式。从这条规定可知,重载运算符时必须至少有一个自定义类型的数据(即对象)作为操作数。,2.运算符重载为成员函数,如果是单目运算符,函数的参数为空。 如果是双目运算符,参数表中有一个参数。 对于双目运算符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(float 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 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); Second+; 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 time: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】 用友元函数实现分数类的相加、相等运算。,#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);/运算符“=”重载友元函数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+(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; /定义分数类对象 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=,同时必须显式定义拷贝构造函数和析构函数。,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号