第四章 运算符重载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 / 49
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功