青岛理工大学C++课件OOPC6-2.ppt_第1页
青岛理工大学C++课件OOPC6-2.ppt_第2页
青岛理工大学C++课件OOPC6-2.ppt_第3页
青岛理工大学C++课件OOPC6-2.ppt_第4页
青岛理工大学C++课件OOPC6-2.ppt_第5页
已阅读5页,还剩25页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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+c1

3、;,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(float

5、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 Compl

6、ex:display()cout(Real,Imag)endl; void main()Complex c1(5.0,10.0),c2(3.0,-2.5),c3; /定义复数类对象 coutc1=;c1.display(); coutc2=;c2.display(); c3=c1+c2; /用重载运算符实现复数加法 coutc3=c1+c2; c3.display(); c3=c1-c2 ; /用重载运算符实现复数减法 coutc1-c2=; c3.display(); ,程序的运行结果为:c1=(5,10)c2=(3,-2,5)c3=c1+c2(8,7.5)c1-c2=(2,12.5),【例

7、6-11】 成员函数形式实现单目运算符“+”的重载。,#include using namespace std;class Clock private: int Hour,Minute,Second; public: Clock(int H=0,int M=0,int S=0); void ShowTime(); void operator+(); /前置单目运算符重载成员函数 Clock operator+(int); /后置单目运算符重载成员函数 ;,Clock:Clock(int H,int M,int S)if(H=0 ,Clock Clock: operator+(int) Cloc

8、k 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; /定义时钟对象 coutFirst time:;clock.ShowTime(); +clock; cout+clock:; clock.ShowTime(); c=clock+; coutclock+:; c.ShowTime(); coutcolck:; clock.ShowTime

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

10、2】 用友元函数实现分数类的相加、相等运算。,#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,Fran

11、c 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 ope

12、rator+(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),

13、f3; /定义分数类对象 coutf1=;f1.display(); coutf2=;f2.display(); f3=f1+f2; /用重载运算符实现分数加法 coutf1+f2=“f3.display( ); if(f1=f2) coutf1和f2相等endl; /判断f1和f2是否相等 else coutf1和f2不相等endl; return 0; ,重载为普通函数,要求类中一定要有get_member之类的成员函数。,bool operator=(Franc f1,Franc f2) if( f1.get_nume( )*f2. get_ deno( )= f2. get_ nume

14、( )*f1. get_ deno( ) return true; else return false;,问题: 已知Complex类。 若有:Complex c1(2,3), c; c=c1+25;,Complex(double x); /suitable convert constructor,Complex Complex:operator+(double x);,cinc; cincc1;,c=c1+c2;/=用不用重载?,提示: The assignment operator(=) 在需要重载时必须被重载成类的成员函数,不能是类的友元函数。 在类的数据成员中含有指针成员时,一般必须重

15、载operator=,同时必须显式定义拷贝构造函数和析构函数。,输入输出符的重载,怎样重载输入输出符号? 返回类型是什么? istream cincom1; cincom2;,(cinamount1)amount2;,operator(cin,com1),istream class TemperatureList public: TemperatureList( ); void add_temperature(double temperature); bool full( ) const; friend ostream,TemperatureList:TemperatureList( ) si

16、ze = 0; void TemperatureList:add_temperature(double temperature) if ( full( ) ) cout Error: adding to a full list.n; exit(1); else listsize = temperature; size = size + 1; ,bool TemperatureList:full( ) const return (size = MAX_LIST_SIZE); ostream ,课堂练习,设计符合要求的类,并给出测试函数main。 类Money: 数据成员:yuan,jiao,fen 成员函数:input() ; output(); opera

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论