C++面向对象运算符重载_第1页
C++面向对象运算符重载_第2页
C++面向对象运算符重载_第3页
C++面向对象运算符重载_第4页
C++面向对象运算符重载_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、1四、操作符重载四、操作符重载重载指的是相同的重载指的是相同的名称名称或或符号符号具有不同的意具有不同的意义。例如:义。例如:函数重载。函数重载。操作符重载操作符重载就是将程序设计语言本身提供就是将程序设计语言本身提供操操作符作符的功能进行的功能进行重新定义重新定义,使该操作符运用于内,使该操作符运用于内部基本数据类型的语义和语法同样运用于部基本数据类型的语义和语法同样运用于类对象类对象等用户自定义类型。等用户自定义类型。既通过编写一些比较特殊的既通过编写一些比较特殊的函数函数来来重新定义重新定义(重载重载)这些操作符。这些操作符。21.基本操作符重载基本操作符重载可以被可以被重载的操作符重载

2、的操作符不能不能被被重载的操作符:重载的操作符:作用域操作符作用域操作符 :成员对象选择操作符成员对象选择操作符 . .* *类对象选择操作符类对象选择操作符 . .条件操作符条件操作符 ?:?:基类对赋值操作符基类对赋值操作符(= =)重载)重载不能不能被派生类被派生类继承继承。a=b.operator+(c);例如例如: :如果需要在某个类如果需要在某个类C C中重载操作符中重载操作符+,+,用来对用来对2 2个该类的对象进行加操作,并用另一个该类的对象存个该类的对象进行加操作,并用另一个该类的对象存放结果。放结果。函数名为operator+, operator关键字返回类型为该类类型参数

3、类型为该类类型的引用调用语法与普通成员函数相同:调用语法与普通成员函数相同:对象b的成员函数operator+被调用实参int main () C a,b,c; a=b + c; return 0;意义更清晰class Cpublic:/C operator+(const C&) const;class C public: C operator+ (const C&); bool operator! ();4通常,重载一个二元操作符,操作符重载通常,重载一个二元操作符,操作符重载成员成员函数只有函数只有一个参数一个参数。重载一个一元操作符重载一个一元操作符, ,其其成员成员函数

4、函数不需要不需要任何参数。任何参数。只有一个参数无参数int main () C a,b,c; c=a + b; if( !c ) return 0;c = a.operator+( b ); 第二个操作数if(c.operator!() 该操作数的成员函数operator!operator!被调用第 一 个 操 作 数 a 的 成 员 函 数operator+被调用class C public: C operator+ (const C&); C operator*(const C&); ;bool operator!(); C operator%();注意注意: : 重载重

5、载不能不能改变操作符的优先级和语法。改变操作符的优先级和语法。二元操作符总是出现在两个操作数二元操作符总是出现在两个操作数之间之间。一元操作符。一元操作符总是出现在它的操作数总是出现在它的操作数之前之前。如果内建操作符是一元的,所有对它的重载仍是如果内建操作符是一元的,所有对它的重载仍是一元一元的。如果内建操作符是二元的,所有对它的重载仍是的。如果内建操作符是二元的,所有对它的重载仍是二二元元的。的。int main () C a,b,c,ans; ans=a + b*c; return 0;ans=a+(b*c);if( !a ) 2.复数类复数类问题:问题:实现一个复数类,完成以下操作:实

6、现一个复数类,完成以下操作: 重载重载+、-、*和和/,以支持复数的算术运算。,以支持复数的算术运算。 设计一个设计一个write函数,输出一个复数。函数,输出一个复数。 设计默认构造函数,将实部和虚部设为零。设计默认构造函数,将实部和虚部设为零。 设计拥有一个参数的构造函数,将实部设为该函数设计拥有一个参数的构造函数,将实部设为该函数,虚部设为零。,虚部设为零。 设计拥有两个参数的构造函数,并将两个参数分别设计拥有两个参数的构造函数,并将两个参数分别赋给实部和虚部。赋给实部和虚部。7声明构造函数声明运算符重载函数9 910108定义一个复数对象(a+bi)+(c+di)=(a+c)+(b+d

7、)i(a+bi)+(c+di)=(a+c)+(b+d)i(a+bi)-(c+di)=(a-c)+(b-d)i(a+bi)-(c+di)=(a-c)+(b-d)i(a+bi) (a+bi) (c+di)=(ac-bd)+(ad+bc)i(c+di)=(ac-bd)+(ad+bc)i(a+bi) /(c+di)=(ac+bd)/(c(a+bi) /(c+di)=(ac+bd)/(c2 2+d+d2 2)+(bc-ad)/(c)+(bc-ad)/(c2 2+d+d2 2 )i )i内建的功能对于操作符,是在对于操作符,是在编译编译时,根据操作数的类型时,根据操作数的类型,决定使用该操作符的,决定使用

8、该操作符的哪种语义。哪种语义。9 910109c1=7.7+5.5ic1=7.7+5.5ic2=4.2+ (-8.3i)c2=4.2+ (-8.3i)c3=0.0+ 0.0ic3=0.0+ 0.0i重载的功能(编译期绑定)重载的功能(编译期绑定)重载的功能(编译期绑定)重载的功能(编译期绑定)c3 = c1.operator+(c2);赋值运算? ?3. 用顶层函数进行操作符重载用顶层函数进行操作符重载一个被重载的操作符,就是一个一个被重载的操作符,就是一个用户自定义的函数用户自定义的函数,只,只不过它可以享有操作符语法所带来的便利。不过它可以享有操作符语法所带来的便利。10成员函数成员函数顶

9、层函数顶层函数其中的其中的、= =、()、()、-必须以必须以类成员函数类成员函数的形式进行重载的形式进行重载除内存管理操作符除内存管理操作符newnew、newnew、deletedelete、deletedelete,一个以顶层函,一个以顶层函数形式被重载的操作符必须在它的数形式被重载的操作符必须在它的参数表参数表中包含一个中包含一个类的对象,类的对象,以便以便让编译器分辨出操作符是内建的还让编译器分辨出操作符是内建的还是用户自定义的。是用户自定义的。有时仅能用有时仅能用顶层函数顶层函数来实现来实现操作符重载操作符重载7 78 8int main () C a,b,c; a=operato

10、r+(b,c); return 0;例如:用例如:用顶层函数顶层函数重载操作符重载操作符+,将两个,将两个C对象加起来,对象加起来,并得到一个并得到一个C对象作为结果。对象作为结果。11重载二元操作符时,需要两个参数顶层操作符重载函数的顶层操作符重载函数的调用调用方式与普通函数相同:方式与普通函数相同:没有类名和域解析操作符函数名加实参这种方式更简洁函数名重载的功能(编译期绑定)12用顶层函数进行操作符重载相对于成员函数的用顶层函数进行操作符重载相对于成员函数的优势优势:转型构造函数将一个浮点数转换成一个Complex对象Complex Complex operator+(const doub

11、le &d) Complex v(real + d, imag); return v; 1 1Complex Complex:operator+( Complex c) const Complex c1(real+c.real, imag +c.imag); return c1; 错误,成员操作符不能用于一个非对象标识,系统也无法将它转换成一个对象Complex operator+(Comlex c1, Comlex c2) /如果设计为顶层函数:如果设计为顶层函数:将转换成一个Complex对象将转换成一个Complex对象使用顶层函数进行重载的一个使用顶层函数进行重载的一个优点优点

12、就是就是非对象非对象操作数可以出现在操作符操作数可以出现在操作符的的左边左边。而使用类成员函数时,。而使用类成员函数时,第一第一个个操作数必须是类的对象。操作数必须是类的对象。Complex operator+(const Comlex& c1, const double &d) /Complex operator+(const double &d, const Comlex& c1) /14错误,顶层函数不能通过对象直接访问类的私有成员有几种方案解决这个问题:有几种方案解决这个问题:1 1)将数据成员)将数据成员realreal和和imagimag设计为设计为

13、公有公有。但违背了类。但违背了类的信息隐藏原则。的信息隐藏原则。2 2)在类中加入用于访问数据成员的)在类中加入用于访问数据成员的公有成员函数公有成员函数。3 3)将顶层操作符重载函数声明为类的)将顶层操作符重载函数声明为类的friendfriend函数函数。但如果直接以下面的方式对复数类但如果直接以下面的方式对复数类ComplexComplex用用顶层顶层函数函数重载操作符重载操作符+ + :4. friend 函数函数一个类的一个类的friendfriend函数可以访问该类的函数可以访问该类的私有私有成员和成员和保护保护成员成员该声明可以放在类的该声明可以放在类的privateprivat

14、e、publicpublic或或protectedprotected任意任意部分。部分。friend friend 函数函数不是不是类的成员函数,却可以访问该类的私类的成员函数,却可以访问该类的私有和保护成员。从严格意义上说,这不符合面向对象原则。有和保护成员。从严格意义上说,这不符合面向对象原则。建议仅在建议仅在重载操作符重载操作符时使用时使用friendfriend函数。函数。关键字int f() / 可以访问该类的可以访问该类的私有私有成员和成员和保护保护成员成员16声明为friendfriend函数定义顶层函数通过对象直接访问类的私有成员175. 输入输出操作符的重载输入输出操作符的重

15、载 C+ C+对右移操作符对右移操作符进行了重载,作为某些进行了重载,作为某些系统类系统类的的成员函数,使其能输入信息到所有的成员函数,使其能输入信息到所有的C+C+内建内建数据类型。数据类型。例:例: int i;int i; cin是系统类istream的对象cin是系统类istream的对象系统类istream的成员函数成员函数如果对用户如果对用户自定义自定义类型重载提取操作符类型重载提取操作符,就必须对,就必须对系统类的源代码进行修改,显然是非常不明智的做法,系统类的源代码进行修改,显然是非常不明智的做法,因此只能将因此只能将重载函数设计为重载函数设计为顶层函数顶层函数。例如:重载例如

16、:重载从键盘来读取从键盘来读取2 2个浮点数,并将其转换成个浮点数,并将其转换成复数,存入一个复数,存入一个ComplexComplex对象中。对象中。输入流类型,以引用方式。系统为了接受输入信息,需要更新输入流对象的信息返回是输入流,可以链式输入自定义类型Complex的对象cinComplex对象,以引用方式,因为需要修改其数据成员需要访问私有成员,声明为friendfriend函数。内建的功能内建的功能类似,设计类似,设计顶层顶层重载函数重载函数operator来输出来输出Complex对象。对象。20返回是输出流,可以链式输出输出流类型,以引用方式Complex对象,以引用方式oper

17、ator(cout,c_obj); Complex c1_obj, c2_obj;cout c1_obj c2_obj;c_obj.write(); cout c_obj.real“+”c_obj.imagi;8 8Complex c_obj;coutc_obj; 内建的功能内建的功能内建的功能内建的功能6. 赋值操作符的重载赋值操作符的重载拷贝构造函数和赋值操作符都用来拷贝构造函数和赋值操作符都用来拷贝拷贝一个类的对象给一个类的对象给另一个同类型的对象。另一个同类型的对象。拷贝构造函数将一个对象拷贝到另一个拷贝构造函数将一个对象拷贝到另一个新新的对象;的对象;赋值操作符将一个对象拷贝到另一个

18、已经赋值操作符将一个对象拷贝到另一个已经存在存在的对象。的对象。如果类的设计者没有提供拷贝构造函数,也没有重载赋如果类的设计者没有提供拷贝构造函数,也没有重载赋值操作符,编译器将会给这个类值操作符,编译器将会给这个类提供提供一个默认拷贝构造函一个默认拷贝构造函数和一个默认赋值操作符。数和一个默认赋值操作符。运行机制运行机制:将源对象中的每个数据成员拷贝到目标对象:将源对象中的每个数据成员拷贝到目标对象相应的数据成员中。相应的数据成员中。class Cpublic: void set_x(int i) x=i; void set_y(int j) y=j; void dump() const cout“x=”x“y=”yendl; private: int x,y;int main() C c1; c1.set_x(100); c1.set_y(-99); C c2(c1); c2.dump(); C c3; c3=c2; c3.dump(); return 0;22没有提供拷贝构造函数也没有重载赋值操作符x x100100创建新对象,使用编译器提供的拷贝构造函数c1c1y y-99-

温馨提示

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

评论

0/150

提交评论