第四章c++运算符重载概要

上传人:今*** 文档编号:107177344 上传时间:2019-10-18 格式:PPT 页数:79 大小:496KB
返回 下载 相关 举报
第四章c++运算符重载概要_第1页
第1页 / 共79页
第四章c++运算符重载概要_第2页
第2页 / 共79页
第四章c++运算符重载概要_第3页
第3页 / 共79页
第四章c++运算符重载概要_第4页
第4页 / 共79页
第四章c++运算符重载概要_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《第四章c++运算符重载概要》由会员分享,可在线阅读,更多相关《第四章c++运算符重载概要(79页珍藏版)》请在金锄头文库上搜索。

1、第四章 运算符重载,4.1什么是运算符重载 4.2运算符重载的方法 4.3重载运算符的规则 4.4运算符重载函数作为类成员函数和友元函数 4.5重载双目运算符 4.6重载单目运算符 4.7重载流插入运算符和流提取运算符 4.9不同类型数据间的转换,4.1什么是运算符重载,C+ 为程序员提供了灵活的手段,让程序员自己定义类,自己设计相应的运算符(必须在已有的运算符基础上设计),使之应用于自己定义的类。与函数重载类似,对已有的运算符赋予新的含义,用一个运算符表示不同功能的运算,这就是运算符重载。 实际上,我们在此之前已经使用了运算符重载。如是C+的移位运算符,它又与流对象cout配合作为流插入运算

2、符,这是C+对进行了重载处理。,运算符重载的实质,将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。 编译系统对重载运算符的选择,遵循函数重载的选择原则。,例4.1 通过成员函数实现复数的加法。 class Complex private: double real; double imag; public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex complex_add(Complex ,Complex Complex:complex_add(Complex ,在

3、Complex类中定义了complex_add函数做加法,函数的参数是引用对象,作为一个加数。在函数里定义了临时对象c,两个赋值语句相当于: c.real = this-real +c2.real; c.imag = this-imag+c2.image; 在main函数中通过对象c1调用加法函数,上面的语句相当于: c.real = c1.real +c2.real; c.imag = c1.imag+c2.image; 能否用+运算符实现复数加法?,4.2运算符重载的方法,运算符重载的方法是定义一个重载运算符函数,在需要时系统自动调用该函数,完成相应的运算。运算符重载实质上是函数的重载。运

4、算符重载函数的格式是: 数据类型 operator 运算符(形参表) 函数实现语句 数据类型:是重载函数返回值的数据类型。 operator 是保留字,形式,可以重载为类成员函数。 特别的:C+规定赋值运算符=、下标运算符、函数调用运算符()、成员运算符-必须定义为类的成员函数; 也可以重载为全局函数,一般为友元函数。 特别的:输出流插入、不能定义为类的成员函数。,4.4.1 重载为成员函数,重载函数名是由operator和运算符联合组成。 如:复数加法运算符重载函数原型可以是: Complex Complex:operator+ (Complex 例4.2 重载运算符+,用于两个复数相加,用

5、成员函数实现。,分析:两个复数相加结果仍是复数,所以函数的返回值的类型也是复数类。调用格式是“对象名.成员名”,此时对象就是一个参与运算的操作数,加法还需要另一个操作数,这个操作数用函数的参数传递,参数的类型就是复数类。,class Complex public: Complex()real=0;imag=0; Complex(double r,double i)real=r;imag=i; Complex operator + (Complex ,void Complex:display() cout“(“real“,“imag“i)“endl; int main() Complex c1(

6、3,4),c2(5,-10),c3; c3=c1+c2; cout“c1=“;c1.display(); cout“c2=“;c2.display(); cout“c1+c2=“;c3.display(); return 0; ,说明: (1)用运行符重载函数取代了加法成员函数。 (2)在主函数中的表达式c3=c2+c1 取代了例4.1中的c3=plex_add(c2) ,编译系统将表达式c3=c1+c2 解释为 c3 = c1.operator + ( c2 ) 对象c1调用的重载函数operator + ,以c2为实参计算两个复数之和。,请考虑在例4.2中能否用一个常量和一个复数相加?如

7、c3 = 3 + c2; / 错误 应该定义对象:Complex C1(3.0,0) : c3 = C1 + c2; 注意:运算符重载后,其运算符原来的功能仍然保留,编译系统根据运算表达式的上下文决定是否调用运算符重载函数。如int a; a = 3+2还是表示整数的加法。,14,赋值运算符与赋值运算符重载 “”,同类型的对象间可以相互赋值,等同于对象的各个成员的一一赋值,其实这是编译器默认添加的一个赋值运算符重载函数所起的作用。,A a(2,3), b; ba;,若对象的成员中有指针数据成员,则仅仅复制该数据成员,而不会复制该数据成员指向的数据。,15,class A char *ps; p

8、ublic: A( ) ps=0; A(char *s ) ps =new char strlen(s)+1; strcpy(ps,s); A( ) if (ps) delete ps; void Show(void) coutpsendl; ; void main(void ) A s1(“China!“),s2(“Computer!“); s1.Show(); s2.Show(); s2=s1; s1.Show(); s2.Show(); ,/相当于 s2.ps=s1.ps;,s1,ps,“China”,s2,ps,“Computer“,s2.ps=s1.ps,首先析构s2,接着析构s1出

9、错,16,这时,利用编译系统的默认赋值无法正确运行程序,必须重载赋值运算符“”,即重新定义“”。 格式为: :operator=() 赋值运算符必须重载为成员函数。,A& A: operator = (A &a),函数返回值类型,成员函数作用域,函数名,函数参数,b=a;,b.operator=(a);,17,class Sample int x; public: Sample(int i=0)x=i; void disp(void) cout“x=“xendl; void operator=(Sample ,18,class A char *ps; public: A( ) ps=0; A(

10、char *s ) ps =new char strlen(s)+1; strcpy(ps,s); A( ) if (ps) delete ps; void Show(void) coutpsendl; A ,必须重新定义“=”,19,A ,s1,ps,“China”,s2,ps,“Computer”,s2=s1;,s2.operator=(s1);,“China”,返回同种类型的引用适合于连等。,s3=s2=s1;,20,class A char *ps; public: A( ) ps=0; A(char *s ) ps =new char strlen(s)+1; strcpy(ps,s

11、); A( ) if (ps) delete ps; char *GetS( ) return ps; A ,s2.ps重新开辟内存,存放“China”,重新开辟内存,4.4.2运算符重载为友元函数,在例4.2程序中对运算符+进行了重载,该例将运算符重载函数定义为复数类的成员函数。 从该程序中看到运算符重载为成员函数时,带一个类类型的形参,而另一个加数就是对象自己(隐性传递this指针参数)。 例4.3 将加法运算符重载为适用于复数加法,重载函数作为类的友元函数。,#include class Complex public: Complex () real=0;imag=0; Complex

12、(double r) real=r;imag=0; Complex (double r,double i) real=r;imag=i; friend Complex operator+ (Complex ,Complex operator+ (Complex ,int main() Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; cout“c1=“; c1.display(); cout“c2=“; c2.display(); cout“c1+c2=“; c3.display(); return 0; ,加法运算符重载为友元函数,C+ 在编译时将表达式c1+c

13、2解释为 operator + ( c1, c2) 即相当于执行以下函数 Complex operator + ( Complex 因为普通函数是不能直接访问对象的私有成员,所以声明为友元函数。,注意:,如想将一个复数和一个整数相加,运算符重载函数作为成员函数定义如下: Complex Complex :operator + ( int 注意在运算符+的左侧必须是Complex类对象,程序中可以写成: c3 = c2 + n 不能写成: c3 = n + c2,注意:,如果要求在使用重载运算符时运算符左侧操作数不是对象,就不能使用前面定义的运算符重载函数。可以将运算符重载函数定义为友元函数:

14、friend Complex operator + ( int 友元函数不要求第一个参数必须是类类型,但是要求实参要与形参一一对应,且参数中必须有一个是类类型: c3 = n + c2 / 顺序正确 c3 = c2 +n / 顺序错误 考虑到各方面的因素,一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。,4.3 重载运算符的规则,C+中可以重载除下列运算符外的所有运算符: . .* : ?: sizeof 只能重载C+语言中已有的运算符,不可臆造新的。 不改变原运算符的优先级和结合性。 不能改变操作数个数,参数不能带默认值。 经重载的运算符,其操作数中至少应该有一个是自定义类型。,

15、4.3 重载运算符的规则,C+默认提供 = 和 & 运算符重载。 C+规定赋值运算符=、下标运算符、函数调用运算符()、成员运算符-必须定义为类的成员函数; 输出流插入、不能定义为类的成员函数,注意仅仅当将作为输出和输入流时才不能定义为类成员函数(也就是说如果要重载为移位运算符的时候不受限制)。,补充 关于返回值为对象类型和对象引用类型的区别,返回值为对象类型 在return语句执行时复制一个临时对象(调用copy构造函数),该临时对象完成使命后(比如A=fun(),fun返回值类型为A类类型,则当A=fun(),这个语句执行后,临时对象的使命就完成了)调用析构函数,结束生命。 返回值为对象引

16、用类型 在return语句执行时不复制对象,仅仅返回引用类型,即把return后面的对象的别名返回(编译器内部实现用指针)。,程序运行结果分析,class A public: A() cout “gouzaon“; A() cout “xigoun“; A(A ,gouzao gouzao gouzao xigou xigou xigou,由于fun返回的是对象,所以会调用拷贝构造函数生成临时对象,当语句b=fun(&a)执行后,临时对象生命结束。 gouzao gouzao copy gouzao xigou gouzao xigou xigou xigou,如果fun函数的返回值为A&,则输出结果是什么?,程序运行结果分析,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号