您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第四章 运算符重载1
运算符重载使得用户自定义的数据以一种更简洁的方式工作。例如intx,y;y=x+y;matrixm1,m2;//矩阵类对象m1=Madd(m1,m2);//调用函数计算两个矩阵的和complexc1,c2;//复数类对象c1=Cadd(c1,c2);//调用函数计算两个复数的和能表示为c1=c1+c2;?能表示为m1=m1+m2;?4.1运算符重载说明:C++中预定义的运算符其运算对象只能是基本数据类型,不适用于用户自定义类型(如类)---定义运算符重载函数4.1.1运算符重载•概念用一个运算符表示不同功能的运算,这就是运算符重载。•实质运算符重载是对已有的运算符赋予多重含义。•实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则。运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名::operatorop(参数表){//相对于该类定义的操作}4.1.2运算符重载的语法形式运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名::operatorop(参数表){//相对于该类定义的操作}4.1.2运算符重载的语法形式函数返回类型运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名::operatorop(参数表){//相对于该类定义的操作}4.1.2运算符重载的语法形式重载该运算符的类4.1.2运算符重载的语法形式运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名::operatorop(参数表){//相对于该类定义的操作}被重载的运算符4.1.2运算符重载的语法形式关键字运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名::operatorop(参数表){//相对于该类定义的操作}4.1.2运算符重载的语法形式函数名运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名::operatorop(参数表){//相对于该类定义的操作}运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名::operatorop(参数表){//相对于该类定义的操作}4.1.2运算符重载的语法形式运算符要求的操作数4.1.2运算符重载的语法形式注意:一个运算符被重载后,原有意义没有失去,只是定义了相对一个特定类的一个新运算符。运算符函数是一种特殊的成员函数或友元函数成员函数的语法形式为:类型类名::operatorop(参数表){//相对于该类定义的操作}4.1.3运算符重载规则重载运算符的限制可以重载的运算符+-*/%^&|~!=+=-=*=/=%^=&=|=====!===&&||++---*‘-[]()newdeletenew[]delete[]不能重载的算符.::.*?:sizeof4.1.3运算符重载规则重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:不改变运算符的优先级不改变运算符的结合性不改变运算符所需要的操作数,因此不能有默认的参数不能创建新的运算符重载运算符必须和用户自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载重载运算符的限制运算符函数可以重载为成员函数或友元函数关键区别在于成员函数具有this指针,友元函数没有this指针不管是成员函数还是友元函数重载,运算符的使用方法相同。但传递参数的方式不同,实现代码不同,应用场合也不同4.2用成员和友元函数重载运算符当一元运算符的操作数,或者二元运算符的左操作数是类的对象时,定义重载算符函数为成员函数重载为成员函数,解释为:单目运算符:Obj.operatorop()操作数由对象Obj通过this指针隐含传递双目运算符:Obj1.operatorop(Obj2)左操作数由Obj1通过this指针传递,右操作数由参数Obj2传递4.2.1用成员函数重载运算符//重载运算符+,用于两个复数相加(成员函数)classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}Complexoperator+(Complex&c1,Complex&c2);voiddisplay();private:doublereal,imag;};ComplexComplex::operator+(Complex&c1,Complex&c2);{Complexc;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;returnc;}voidComplex::display(){cout(real,imagi)endl;}voidmain(){Complexc1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();}c1.operator+(c2)c1对象就是一个参与运算的操作数//重载运算符+,用于两个复数相加(成员函数)classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}Complexoperator+(Complex&c1,Complex&c2);voiddisplay();private:doublereal,imag;};ComplexComplex::operator+(Complex&c1,Complex&c2);{Complexc;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;returnc;}voidComplex::display(){cout(real,imagi)endl;}voidmain(){Complexc1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();}运算符重载函数为成员函数时,第一个参数可以省略,但是必须为自身类中的对象//重载运算符+,用于两个复数相加(成员函数)classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}Complexoperator+(Complex&c1,Complex&c2);voiddisplay();private:doublereal,imag;};ComplexComplex::operator+(Complex&c1,Complex&c2){Complexc;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;returnc;}voidComplex::display(){cout(real,imagi)endl;}voidmain(){Complexc1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();}(Complex&c2);c.real=real+c2.real;c.imag=imag+c2.imag;(Complex&c2);运算符重载函数的第一个参数是隐含的,由this指针隐式访问类对象成员。//重载运算符+,用于两个复数相加(成员函数)classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}Complexoperator+(Complex&c1,Complex&c2);voiddisplay();private:doublereal,imag;};ComplexComplex::operator+(Complex&c1,Complex&c2){Complexc;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;returnc;}voidComplex::display(){cout(real,imagi)endl;}voidmain(){Complexc1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();}(Complex&c2);c.real=this-real+c2.real;c.imag=this-imag+c2.imag;(Complex&c2);(Complex&c2);说明:运算符重载函数作为成员函数,第一个操作数可以省略,但是必须为自身类中的对象,而且与运算符函数的类型相同第二个操作数可为自身类对象也可为普通数据类型this-real,this-imag就是c1.real,c1.imag4.2.2用友元函数重载当二元运算符的左操作数为C++标准类型(如int)或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能为非成员函数。如果函数需要访问类的私有成员,则必须声明为该类的友元函数。重载为友元函数,解释为:单目运算符:operatorop(Obj)操作数由参数表的参数Obj提供双目运算符:operatorop(Obj1,Obj2)左右操作数都由参数传递//重载运算符+,用于两个复数相加(友元函数)classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}friendComplexoperator+(Complex&c1,Complex&c2);voiddisplay();private:doublereal,imag;};ComplexComplex::operator+(Complex&c1,Complex&c2){Complexc;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;returnc;}voidComplex::display(){cout(real,imagi)endl;}voidmain(){Complexc1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();}C++在编译时将表达式c1+c2解释为:operator+(c1,c2)//重载运算符+,用于两个复数相加(成员函数)classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}friendComplexoperator+(Complex&c1,Complex&c2);voiddisplay();private:doublereal,imag;};ComplexComplex::operator+(Complex&c1,Complex&c2){Complexc;c.real=c1.rea
本文标题:第四章 运算符重载1
链接地址:https://www.777doc.com/doc-5540829 .html