《操作符重载》PPT课件.ppt

上传人:牧羊曲112 文档编号:5517238 上传时间:2023-07-16 格式:PPT 页数:35 大小:231.49KB
返回 下载 相关 举报
《操作符重载》PPT课件.ppt_第1页
第1页 / 共35页
《操作符重载》PPT课件.ppt_第2页
第2页 / 共35页
《操作符重载》PPT课件.ppt_第3页
第3页 / 共35页
《操作符重载》PPT课件.ppt_第4页
第4页 / 共35页
《操作符重载》PPT课件.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《《操作符重载》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《操作符重载》PPT课件.ppt(35页珍藏版)》请在三一办公上搜索。

1、第七章 操作符重载,苏劲松2012年,本章内容,操作符重载的需要性作为成员函数重载作为全局(友元)函数重载一些特殊操作符的重载,操作符重载的需要性,C+本身没有提供复数类型,可定义一个类来实现:class Complex/复数类定义public:Complex(double r=0.0,double i=0.0)real=r;imag=i;void display()const cout real+imag i;.private:double real;double imag;,方案一:定义Complex类成员函数add:class Complexpublic:Complex add(cons

2、t Complex,方案二:定义一个全局函数:class Complex/复数类定义.friend Complex complex_add(const Complex,C+允许对已有的操作符进行重载,使得它们能对自定义类型(类)的对象进行操作。操作符可以以两种方式重载:以成员函数形式重载 class Complex public:Complex operator+(const Complex,以带有类、结构、枚举或者它们的引用类型参数的全局函数形式重载class Complex.friend Complex operator+(const Complex,操作符重载的基本原则,只能重载C+语言

3、中已有的操作符,不可臆造新的操作符。可以重载C+中除下列操作符外的所有操作符:“.”,“.*”,“?:”,“:”,“sizeof”重载不改变原操作符的优先级和结合性。重载不能改变操作数个数。尽量遵循已有操作符的语义(不是必需的)。,作为成员函数重载操作符,双目操作符重载定义格式class.operator#();/#代表操作符;:operator#().使用格式 a;b;a#b 或 a.operator#(b),例、实现复数的“等于”和“不等于”操作。,class Complex double real,imag;public:.bool operator=(const Complex.if(

4、c1=c2)/或 if(c1!=c2),单目操作符重载定义格式class.operator#();:operator#().使用格式 a;#a 或 a.operator#(),例:实现复数的取负操作,class Complex.public:Complex operator-()const Complex temp;temp.real=-real;temp.imag=-imag;return temp;.Complex a(1,2),b;b=-a;/把b修改成a的负数。,操作符+和-的重载,操作符+(-)有前置和后置两种用法,如果没有特殊说明,它们的前置用法与后置用法均使用同一个重载函数:op

5、erator+();为了能够区分+(-)的前置与后置用法,可为它们再写一个重载函数用于实现它们的后置用法,该重载函数应有一个形式上的int型参数:operator+(int);,class Counterint value;public:Counter()value=0;Counter/使用的是上述类定义中带int型参数的操作符+重载函数,作为全局(友元)函数重载操作符,操作符也可以作为全局函数来重载,要求操作符重载函数的参数类型至少有一个为类、结构、枚举或它们的引用类型。如果在操作符重载函数中需要访问参数类的私有成员(提高访问效率),则需要把它说明成相应类的友元。,双目操作符重载定义格式:o

6、perator#(,).使用格式:a;b;a#b 或 operator#(a,b),单目操作符重载定义格式 operator#().使用格式 a;#a 或 operator#(a)也可以专门定义一个后置用法的重载函数:operator#(,int),重载+实现实数与复数的混合运算,class Complex double real,imag;public:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;.friend Complex operator+(const Complex,Complex operator+(

7、const Complex,赋值操作符“=”的重载,C+编译程序会为每个类定义一个隐式的赋值操作符重载函数,其行为是:逐个成员进行赋值操作(member-wise assignment)。对于普通成员,它采用常规的赋值操作。对于成员对象,则调用该成员对象的赋值操作符重载函数进行赋值操作,该定义对成员对象是递归的。,对下面类A对象进行赋值操作时,存在以下问题:class A int x,y;char*p;public:A()x=y=0;p=NULL;A(const char*str)p=new charstrlen(str)+1;strcpy(p,str);x=y=0;A()delete p;p

8、=NULL;,A a(xyz),b(abcdefg);.a=b;/赋值后,a.p原来所指向的空间成了“孤儿”。,x,y,p,x,y,p,a,b,xyz,0,0,0,0,abcdefg,解决办法:自己定义赋值操作符重载函数。A,自定义的赋值操作符重载函数不会自动地去进行成员对象的赋值操作,必须要在自定义的赋值操作符重载函数中显式地指出class A.;class B A a;int x,y;public:.B,赋值操作符只能作为非静态的成员函数来重载。一般来讲,需要自定义拷贝构造函数的类通常也需要自定义赋值操作符重载函数。注意:要区别何时调用拷贝构造函数和赋值操作符=重载函数。A a;A b 3

9、=a;/调用拷贝构造函数,它等价于:A b(a);。.b=a;/调用赋值操作符=重载函数。,数组元素访问操作符“”的重载,由具有线性关系的元素所构成的对象,可重载“”,实现对其元素的访问。class Stringchar*p;public:char.si./访问s表示的字符串中第i个字符。,类成员访问操作符“-”的重载,“-”为一个双目操作符,其第一个操作数为一个指向类或结构的指针,第二个操作数为第一个操作数所指向的类或结构的成员。“-”只能作为非静态成员函数重载,重载时需要按单目操作符重载形式来实现。通过对“-”进行重载,可以实现一种智能指针(smart pointers):一个具有指针功能

10、的对象,通过该对象访问所“指向”的另一个对象时,在访问所指向对象的成员前能做一些额外的事情。,class B/智能指针类A*p_a;int count;public:B(A*p)p_a=p;count=0;A*operator-()/操作符“-”的重载函数count+;return p_a;int num_of_a_access()constreturn count;A a;B b(/显示对象a的访问次数,class Aint x,y;public:void f();void g();,自定义类型转换操作符,带一个参数的构造函数可以用作从一个基本数据类型或其它类到一个类的转换。class Co

11、mplexdouble real,imag;public:Complex()real=0;imag=0;Complex(double r)/一个参数的构造函数可兼作类型转换real=r;imag=0;Complex(double r,double i)real=r;imag=i;friend Complex operator+(const Complex,Complex operator+(const Complex/2.5隐式转换成一个复数对象Complex(2.5),自定义类型转换函数 class A int x,y;public:.operator int()return x+y;/类型

12、转换操作符int的重载函数;.A a;int i=1;int z=i+a;/将调用类型转换操作符int的重载函数/把对象a隐式转换成int型数据。,class Aint x,y;public:A()x=0;y=0;A(int i)x=i;y=0;operator int()return x+y;friend A operator+(const A/是a转换成int呢,还是i转换成A?,对上面的问题,可以用显式类型转换来解决:z=(int)a+i;或 z=a+(A)i;也可以通过给A类的构造函数A(int i)加上一个修饰符explicit来解决class A.explicit A(int i)/禁止把它当作隐式类型转换符来用。x=i;y=0;.;,函数调用操作符(),在C+中,把函数调用也作为一种操作符来看待,并且可以针对类来对其进行重载。函数调用操作符只能作为非静态的成员函数来实现 class Aint value;public:A()real=0;imag=0;A(int i)value=i;int operator()(int x)/函数调用操作符()的重载函数 return x+value;,A a(3);cout a(10)endl;/a(10)将会去调用A中的函数调用/操作符函数,10作为实参,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号