资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,7.1,运算符重载规则,7.2,用成员或友员函数重载运算符,2026/2/1 周日,1,问题,:,传统的预定义运算符只适应一般的算术运算,但对于对象之间的运算,如,A,、,B,是类,Calulator,的对象那么,,A+B,,,A+,,,A-,的结果是什么?这就需要用重载来推广运算符的意义。,2026/2/1 周日,2,运算符重载使得用户自定义的数据以一种更简洁的方式工作,例如,int,x,y;,y=x+y;,matrix,m1,m2;,/,矩阵类对象,m2=,Madd,(m1,m2);,/,调用函数计算两个矩阵的和,complex,c1,c2;,/,复数类对象,c1=,Cadd,(c1,c2);,/,调用函数计算两个复数的和,能表示为,c1=c1+c2;,?,能表示为,m1=m1+m2;,?,第,7,章,运算符,重载,定义,运算符重载函数,2026/2/1 周日,3,7.1,运算符重载规则,7.1.1,重载运算符的限制,可以重载的运算符,+-*/%&|,!=+=-=*=/=%,=&=|=*-,()newdeletenewdelete,不能重载的算符,.:*?:#,2026/2/1 周日,4,7.1,运算符重载规则,7.1.1,重载运算符的限制,重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:,不改变运算符的优先级,不改变运算符的结合性,不改变运算符所需要的操作数,不能创建新的运算符,2026/2/1 周日,5,7.1.2,运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数,语法形式为:,类型,类名,:operator,op,(,参数表,),/,相对于该类定义的操作,2026/2/1 周日,6,7.1.2,运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数,语法形式为:,类型,类名,:operator,op,(,参数表,),/,相对于该类定义的操作,函数返回类型,2026/2/1 周日,7,7.1.2,运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数,语法形式为:,类型,类名,:operator,op,(,参数表,),/,相对于该类定义的操作,重载该运算符的类,2026/2/1 周日,8,7.1.2,运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数,语法形式为:,类型,类名,:operator,op,(,参数表,),/,相对于该类定义的操作,被重载的运算符,2026/2/1 周日,9,7.1.2,运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数,语法形式为:,类型,类名,:,operator,op,(,参数表,),/,相对于该类定义的操作,关键字,2026/2/1 周日,10,7.1.2,运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数,语法形式为:,类型,类名,:,operator,op,(,参数表,),/,相对于该类定义的操作,函数名,2026/2/1 周日,11,7.1.2,运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数,语法形式为:,类型,类名,:,operator,op,(,参数表,),/,相对于该类定义的操作,运算符要求的操作数,2026/2/1 周日,12,7.1.2,运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数,语法形式为:,类型,类名,:,operator,op,(,参数表,),/,相对于该类定义的操作,一个,运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符,2026/2/1 周日,13,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator()();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,6.1.2,运算符重载的语法形式,2026/2/1 周日,14,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator()();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,重载了,3,个算符,6.1.2,运算符重载的语法形式,2026/2/1 周日,15,#include,#include,class Calculator,public:,Calculator()value=0;,void,operator+,();,void,operator-,();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,重载了,3,个算符,6.1.2,运算符重载的语法形式,2026/2/1 周日,16,#include,#include,class Calculator,public:,Calculator()value=0;,void,operator+,();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,void Calculator:,operator+,(),if(value 65535)value+;,else,cout,nData,overflow!,endl,;,abort();,6.1.2,运算符重载的语法形式,2026/2/1 周日,17,#include,#include,class Calculator,public:,Calculator()value=0;,void,operator+,();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,void Calculator:,operator+,(),if(value 65535),value+,;,else,cout,nData,overflow!,endl,;,abort();,使用,系统预定义版本,6.1.2,运算符重载的语法形式,2026/2/1 周日,18,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void,operator-,();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,6.1.2,运算符重载的语法形式,2026/2/1 周日,19,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void,operator-,();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!0),value-,;,else,cout,n Data overflow!,endl,;,abort();,使用,系统预定义版本,6.1.2,运算符重载的语法形式,2026/2/1 周日,20,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,+Counter;,调用重载版本,void operator+();,6.1.2,运算符重载的语法形式,2026/2/1 周日,21,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,+Counter;,void operator+();,调用重载版本,6.1.2,运算符重载的语法形式,2026/2/1 周日,22,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,void operator+();,调用重载版本,Counter.operator+(),;,6.1.2,运算符重载的语法形式,2026/2/1 周日,23,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,-Counter;,调用重载版本,void operator-();,6.1.2,运算符重载的语法形式,2026/2/1 周日,24,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,-Counter;,调用重载版本,void operator-();,6.1.2,运算符重载的语法形式,2026/2/1 周日,25,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,调用重载版本,void operator-();,Counter.operator-(),;,6.1.2,运算符重载的语法形式,2026/2/1 周日,26,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,Counter();,调用重载版本,void operator()();,6.1.2,运算符重载的语法形式,2026/2/1 周日,27,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,Counter();,void operator()();,被重载的运算符,6.1.2,运算符重载的语法形式,2026/2/1 周日,28,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,Counter();,void operator()();,函数参数表,Counter.,operator(),(),;,6.1.2,运算符重载的语法形式,2026/2/1 周日,29,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,6.1.2,运算符重载的语法形式,2026/2/1 周日,30,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;,i=5,;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort(),;,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,6.1.2,运算符重载的语法形式,2026/2/1 周日,31,#include,#include,class Calculator,public:,Calculator()value=0;,void operator+();,void operator-();,unsigned,int,operator(),();,private:,unsigned,int,value;,;,void main(),Calculator Counter;,int,i;,for(i=0;i 5;i+),+Counter;,cout,n Counter=Counter();,for(i=0;i=5;i+),-Counter;,cout,n Counter=Counter();,void Calculator:operator+(),if(value 65535)value+;,else,cout,nData,overflow!0)value-;,else,cout,n Data overflow!,endl,;,abort();,unsigned,int,Calculator:operator()(),return value;,设计一个安全计数器,6.1.2,运算符重载的语法形式,2026/2/1 周日,32,运算符函数可以重载为成员函数或友员函数,关键区别在于成员函数具有,this,指针,友员函数没有,this,指针,不管是成员函数还是友员函数重载,算符的使用方法相同。但,传递参数的方法不同,实现代码不同,应用场合也不同,7.2,用成员或友员函数重载运算符,2026/2/1 周日,33,重载为成员函数,解释为:,Object.,operator,op,(),操作数由对象,Object,通过,this,指针隐含传递,重载为友员函数,解释为:,operator,op,(Object),操作数由参数表的参数,Object,提供,7.2,用成员或友员函数重载运算符,1,一元运算符,Object,op,或,op,Object,2026/2/1 周日,34,重载为成员函数,解释为:,ObjectL,.,operator,op,(,ObjectR,),左操作数由,ObjectL,通过,this,指针传递,右操作数由参数,ObjectR,传递,重载为友员函数,解释为:,operator,op,(,ObjectL,ObjectR,),左右操作数都由参数传递,7.2,用成员或友员函数重载运算符,2,二元运算符,ObjectL,op,ObjectR,2026/2/1 周日,35,当一元运算符的操作数,或者二元运算符的左操作数,是该类的一个对象时,定义重载算符函数为成员函数,7.2.1,用成员函数重载算符,6.2.1,用成员函数重载算符,2026/2/1 周日,36,例,建立一个描述,3,维坐标的类,Tri_Coordinates,,,重载算符“,+”,、“,+”,、和“,=”,,实现简单的算术运算,7.2.1,用成员函数重载算符,6.2.1,用成员函数重载算符,2026/2/1 周日,37,#include,class,TriCoor,public:,TriCoor,(,int,mx,=0,int,my=0,int,mz,=0)x=,mx,;y=my;z=,mz,;,TriCoor,operator+(,TriCoor,t),TriCoor,temp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,TriCoor,operator=(,TriCoor,t)x=t.x;y=t.y;z=t.z;return*this;,TriCoor,operator+()x+;y+;z+;return*this;,void show(),cout,x ,y ,z n;,void assign(,int,mx,int,my,int,mz,)x=,mx,;y=my;z=,mz,;,private:,int,x,y,z;,/3_d coordinates,;,void main(),TriCoor,a(1,2,3),b,c;,a.show();b.show();c.show();,for(,int,i=0;i 5;i+)b+;b.show();,c.assign(3,3,3);c=a+b+c;c.show();,c=b=a;c.show();,6.2.1,用成员函数重载算符,2026/2/1 周日,38,#include,class,TriCoor,public:,TriCoor,(,int,mx,=0,int,my=0,int,mz,=0)x=,mx,;y=my;z=,mz,;,TriCoor,operator+(,TriCoor,t),TriCoor,temp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,TriCoor,operator=(,TriCoor,t)x=t.x;y=t.y;z=t.z;return*this;,TriCoor,operator+()x+;y+;z+;return*this;,void show(),cout,x ,y ,z n;,void assign(,int,mx,int,my,int,mz,)x=,mx,;y=my;z=,mz,;,private:,int,x,y,z;,/3_d coordinates,;,void main(),TriCoor,a(1,2,3),b,c;,a.show();b.show();c.show();,for(,int,i=0;i,x+t.x;temp.y=,this-,y+t.y;temp.z=,this-,x+t.z;,return temp;,c=a+b+c;,a+b,a.operator+(b),Object1,通过匿名对象,Object1,返回运算结果,6.2.1,用成员函数重载算符,2026/2/1 周日,39,#include,class,TriCoor,public:,TriCoor,(,int,mx,=0,int,my=0,int,mz,=0)x=,mx,;y=my;z=,mz,;,TriCoor,operator+(,TriCoor,t),TriCoor,temp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,TriCoor,operator=(,TriCoor,t)x=t.x;y=t.y;z=t.z;return*this;,TriCoor,operator+()x+;y+;z+;return*this;,void show(),cout,x ,y ,z n;,void assign(,int,mx,int,my,int,mz,)x=,mx,;y=my;z=,mz,;,private:,int,x,y,z;,/3_d coordinates,;,void main(),TriCoor,a(1,2,3),b,c;,a.show();b.show();c.show();,for(,int,i=0;i,x+t.x;temp.y=,this-,y+t.y;temp.z=,this-,x+t.z;,return temp;,c=a+b+c;,a+b,a.operator+(b),Object1,a+b,+c,Object1,+c,Object1,.operator+(c),通过匿名对象,Object2,返回运算结果,Object2,6.2.1,用成员函数重载算符,2026/2/1 周日,40,#include,class,TriCoor,public:,TriCoor,(,int,mx,=0,int,my=0,int,mz,=0)x=,mx,;y=my;z=,mz,;,TriCoor,operator+(,TriCoor,t),TriCoor,temp;,temp.x=x+t.x;temp.y=y+t.y;temp.z=z+t.z;,return temp;,TriCoor,operator=(,TriCoor,t)x=t.x;y=t.y;z=t
展开阅读全文