运算符重载《C程序设计基础教程》_第1页
运算符重载《C程序设计基础教程》_第2页
运算符重载《C程序设计基础教程》_第3页
运算符重载《C程序设计基础教程》_第4页
运算符重载《C程序设计基础教程》_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、第第1010章章 运算符重载运算符重载?C+?C+程序设程序设计根底教程计根底教程? ?课件课件4void Complex display( ) cout(real,imagi)endl;int main( ) Complex c1(3,4),c2(5,-10),c3; c3=c1 plex_add(c2); /相加相加coutc1+c2=; c3.display( ); c1+c2=(8,-6i)缺点缺点:不直观、烦琐,不便:不直观、烦琐,不便例例10.1 通过成员函数实现复数对象求和通过成员函数实现复数对象求和问题:能否用问题:能否用“+号进行两个复数的相加?号进行两个复数的相加?实质:用

2、户能否根据需要对实质:用户能否根据需要对C+已提供的运算符重载,已提供的运算符重载,赋予新含义,赋予新含义, 实现新功能。实现新功能。c3=c1+c2;5定义重载运算符的函数,执行被重载的运算符时,定义重载运算符的函数,执行被重载的运算符时,系统自动调用该函数,实现相应运算。系统自动调用该函数,实现相应运算。运算符重载的实质运算符重载的实质:一般定义格式一般定义格式 类型名类型名 operator 运算符名称运算符名称 (形参表列形参表列) 对运算符的重载处理对运算符的重载处理 &Complex operator + (Complex &c2);&Complex ope

3、rator + (Complex &c1,Complex &c2);函数重载函数重载10.1 什么是运算符重载什么是运算符重载6例例10.2 重载重载“+,用于两复数相加,用于两复数相加class Complexpublic: Complex( )real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex operator + (Complex &c2); void display( ); private: double real; double imag;Complex Complex operato

4、r+(Complex &c2) Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c;7void Complex display( ) cout(real,imagi)endl;void main( ) Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; /运算符运算符+用于复数运算用于复数运算 coutc1+c2=; c3.display( );c1+c2=(8,-6i)例例10.2 重载重载“+,用于两复数相加,用于两复数相加8(1) 不许定义新运算符,只能重载已有运算符不许定义新运算

5、符,只能重载已有运算符(2) 被重载后,原有功能仍然保存。被重载后,原有功能仍然保存。(3) 重载不改变优先级别重载不改变优先级别(4) 重载不改变结合性重载不改变结合性(5) 重载不改变元数重载不改变元数Binary operators declared as member functions take one argument; if declared as global functions, they take two arguments.Unary operators declared as member functions take no arguments; if declared

6、 as global functions, they take one argument.10.2 重载运算符的规那么重载运算符的规那么9Table 10.1 Nonredefinable Operators OperatorName.Member selection.* Pointer-to-member selection:Scope resolution? :Conditional#Preprocessor symbol10.2 重载运算符的规那么重载运算符的规那么1010.3 运算符重载的实现形式运算符重载的实现形式“+是双目运算符,为什么在例是双目运算符,为什么在例10.2中的重载函

7、中的重载函数中只有一个参数?数中只有一个参数?原因:重载函数是原因:重载函数是Complex类的成员函数,有一类的成员函数,有一个参数是隐含的个参数是隐含的this指针。指针。两个参与运算对象两个参与运算对象this指针指向指针指向实参对象引用实参对象引用c1+c2c1.operator+(c2) 11class Complexpublic: Complex( )real=0;imag=0; Complex(double r,double i)real=r;imag=i; friend Complex operator + (Complex &c1,Complex &c2);

8、void display( ); private: double real; double imag;Complex operator + (Complex &c1,Complex &c2) return Complex(c1.real+c2.real, c1.imag+c2.imag);例例10.3 作为友元全局函数作为友元全局函数12void Complex display( ) cout(real,imagi)endl;int main( )Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; coutc1=; c1.display( ); co

9、utc2=; c2.display( ); coutc1+c2 =; c3.display( );例例10.3 作为友元全局函数作为友元全局函数13类成员函数类成员函数:自由访问本类的数据成员,少写:自由访问本类的数据成员,少写一个参数,但要求第一参数是类对象,且与运一个参数,但要求第一参数是类对象,且与运算符函数的类型相同。算符函数的类型相同。Complex Compex:operator +(int &i)return Complex(real+i,image);c3=c2+ic3=i+c2普通全局函数普通全局函数:极少情况下使用,不能直接访:极少情况下使用,不能直接访问类的私有成

10、员。问类的私有成员。10.3 运算符重载的实现形式运算符重载的实现形式14友元全局函数友元全局函数:第一参数可为:第一参数可为C+标准类型或标准类型或其他类对象,可访问类的私有成员。其他类对象,可访问类的私有成员。 friend Complex operator+(int &i,Complex &c); Complex operator+(int &i, Complex &c) return Complex(i+c.real,c.imag);必须有两个参数,实参与形参顺序要一一对必须有两个参数,实参与形参顺序要一一对应。应。c3=i+c2; c3=c2+i; 1

11、0.3 运算符重载的实现形式运算符重载的实现形式1510.3 重载单目运算符重载单目运算符例例10.5 有有Time类,含数据成员类,含数据成员minute(分分)和和sec(秒秒),模拟秒表,每次走一秒,满,模拟秒表,每次走一秒,满60秒进一秒进一分钟,此时秒又从分钟,此时秒又从0开始。要求输出分和秒的开始。要求输出分和秒的值。值。16class Timepublic: Time(int m,int s):minute(m),sec(s) Time operator+( ); /声明运算符重载函数声明运算符重载函数 void display( )coutminute:sec=60) sec-

12、=60; /满满60秒进秒进1分钟分钟 +minute; return *this; 例例10.5 模拟秒表模拟秒表例10.5.txt17int main( )Time time1(34,0); for (int i=0;i61;i+) +time1; time1.display( );34:134:234:5935:035:1 (共输出共输出61行行)10.3 重载单目运算符重载单目运算符18例例10.4 增加对增加对后置后置自增运算符的重载自增运算符的重载class Timepublic: Time( )minute=0;sec=0; Time(int m,int s):minute(m)

13、,sec(s) Time operator+( ); /前置前置“+ Time operator+(int); /后置后置“+ void display( )coutminute:sec=60) sec-=60; +minute; return *this; /返回自加后的对象返回自加后的对象Time Time operator+(int) /后置后置“+ Time temp(*this); sec+; if(sec=60) sec-=60; +minute; return temp; /返回自加前的对象返回自加前的对象例例10.4 增加对后置自增运算符的重载增加对后置自增运算符的重载20in

14、t main( )Time time1(34,59),time2; cout time1 : ; time1.display( ); +time1; cout+time1: ; time1.display( ); time2=time1+; /自加前的对象值赋给自加前的对象值赋给time2 couttime1+: ; time1.display( ); cout time2 :; time2.display( ); /输出输出time2对象的值对象的值例例10.4 增加对后置自增运算符的重载增加对后置自增运算符的重载time1 : 34:59 (time1原值原值)+time1: 35:0 (

15、执行执行+time1后后time1的值的值)time1+: 35:1 (再执行再执行time1+后后time1的值的值)time2 : 35:0 (time2保存执行保存执行time1+前的值前的值)21重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符#include 对对“重载的函数形式重载的函数形式 istream & operator (istream &,自定义自定义类类 &);ostream& operator 和和“的函数作为友的函数作为友元全局函数或非友元全局函数访问公有元全局函数或非友元全局函数访问公有成员,而不能是成员函数。成员,而

16、不能是成员函数。22例例10.5 用重载的用重载的“输出复数输出复数class Complexpublic: Complex( )real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex operator + (Complex &c2); friend ostream& operator (ostream&,Complex&); private: double real; double imag;23Complex Complex operator + (Complex &c2) re

17、turn Complex(real+c2.real,imag+c2.imag);ostream& operator(ostream& output, Complex& c)output(c.real+c.imagi)endl; return output;int main( )Complex c1(2,4), c2(6,10), c3; c3=c1+c2; coutc3;例例10.5 用重载的用重载的“运算符运算符“:从一个输入流中提取数据。:从一个输入流中提取数据。目的:希望将目的:希望将“用于输入自定义类对象用于输入自定义类对象的信息。的信息。25例例10.6 重载

18、流提取运算符重载流提取运算符“class Complexpublic: friend ostream& operator (istream&,Complex&); private: double real; double imag;ostream& operator (ostream& output,Complex& c) output(c.real+c.imag (istream& input,Complex& c)inputc.realc.imag; return input;26int main( ) Complex c1,

19、c2; cinc1c2; coutc1=c1endl; coutc2=c22710.6 不同类型数据间的转换不同类型数据间的转换标准类型数据间的转换标准类型数据间的转换int i = 6;i = 7.5 + i;隐式类型转换隐式类型转换:编译系统自动完成。:编译系统自动完成。显式类型转换:显式类型转换:程序中具体指定。程序中具体指定。int(89.5)显式类型转换形式显式类型转换形式类型名类型名(数据数据) 或或 (类型名类型名)数据数据2810.6.2 转换转换构造函数构造函数作用作用:将:将其他类型的数据其他类型的数据转换成类的对象。转换成类的对象。默认构造函数默认构造函数Complex(

20、 ); /没有参数没有参数用于初始化的构造函数用于初始化的构造函数Complex(double r,double i); /一般有两个以上参数一般有两个以上参数用于复制对象的复制构造函数用于复制对象的复制构造函数Complex (Complex &c); /形参是本类对象的引用形参是本类对象的引用转换构造函数:转换构造函数:只有一个形参只有一个形参 Complex(double r) real=r;imag=0;2910.6.2 转换构造函数转换构造函数使用方法使用方法 (1) 声明类。声明类。(2) 定义只有一个参数的构造函数,参数类型定义只有一个参数的构造函数,参数类型是需转换的类

21、型,体内指定转换的方法。是需转换的类型,体内指定转换的方法。(3) 进行类型转换:进行类型转换:类名类名(指定类型的数据指定类型的数据)转换对象转换对象标准类型数据标准类型数据另一个类对象另一个类对象3010.6.3 类型转换函数类型转换函数作用作用:将一个类对象转换成另一类型的数据。:将一个类对象转换成另一类型的数据。 operator double( ) return real;定义的一般形式定义的一般形式operator 类型名类型名( )实现转换的语句实现转换的语句 不能指定不能指定函数返回类型函数返回类型,参数参数。返回类型由函数。返回类型由函数名中指定的类型名确定。名中指定的类型名确定。只能作为成员函数。只能作为成员函数。31例例10.6 使用类型转换函数使用类型转换函数class Complex public: Complex( )real=0;imag=0; Complex(double r,double i)real=r;imag=i; operator double( ) return real; /类型

温馨提示

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

最新文档

评论

0/150

提交评论