C++程序设计第10章 重载操作符教学课件.ppt

上传人:春哥&#****71; 文档编号:90588405 上传时间:2023-05-16 格式:PPT 页数:47 大小:3.17MB
返回 下载 相关 举报
C++程序设计第10章 重载操作符教学课件.ppt_第1页
第1页 / 共47页
C++程序设计第10章 重载操作符教学课件.ppt_第2页
第2页 / 共47页
点击查看更多>>
资源描述

《C++程序设计第10章 重载操作符教学课件.ppt》由会员分享,可在线阅读,更多相关《C++程序设计第10章 重载操作符教学课件.ppt(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C+程序设计第10章 重载操作符教学课件第十章第十章 重载操作符重载操作符http:/ 本章内容提要3一、重载操作符的定义和使用 二、输出和输入操作符的重载 三、赋值操作符 四、算术和关系操作符的重载 五、不同类型数据间的转换http:/ 重载操作符的定义与使用 重载操作符的概念和定义格式 可重载的操作符 使用重载操作符 类成员和全局操作符 操作符重载和友元的关系4http:/ 重载操作符的概念l 重载操作符就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。重载操作符可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过程。5http:/ 重载操作

2、符定义格式函数类型 operator 运算符名称(形参列表)对运算符的重载operator用于定义重载操作符的函数,可以把operator和运算符名称看成是一个整体,它们在重载操作符中共同起到了将运算符进行重载的作用。这里需要注意的是:(1)不要忘记在operator前面加上函数类型。很多用户会在定义时忘记了函数类型,最后导致程序编译的错误。(2)一般为了类的简洁,在类中只进行运算符重载的声明,在类外再定义运算符的重载。6http:/ 可重载的操作符7C+中已有的操作符大多数都可以被重载,C+中允许重载的操作符如表10-1所示。表表10-1 可重可重载载的的运算符运算符类别类别所包含的运算符所

3、包含的运算符双目算数运算符双目算数运算符+(加)、(加)、(减)、(减)、*(乘)、(乘)、/(除)、(除)、%(取余)(取余)赋值赋值运算符运算符=、+=、=、*=、/=、%=、&=、|=、=、=逻辑逻辑运算符运算符|(逻辑逻辑或)、或)、&(逻辑逻辑与)、!(与)、!(逻辑逻辑非)非)关系运算符关系运算符=(等于)、!(等于)、!=(不等于)、(不等于)、(大于)、(大于)、=(大于等于)(大于等于)单单目运算符目运算符+(正)、(正)、(负负)、)、*(指(指针针)、)、&(取地址)(取地址)自增自减运算符自增自减运算符+(自增)、(自增)、-(自减)(自减)位运算符位运算符|(按位或)

4、、(按位或)、&(按位与)、(按位与)、(按位取反)、(按位取反)、(按位异或)、(按位异或)、(右移)(右移)空空间间申申请请与与释释放放New、delete、new、delete其他运算符其他运算符()(调调用函数)、用函数)、-(访问访问成成员员)、)、-*(成(成员员指指针访问针访问)、,(逗号)、)、,(逗号)、(下(下标标)http:/ 注意:l 不能重载的运算符只有5个,分别为:成员访问运算符(.)、域运算符(:)、成员指针访问运算符(.*)、长度运算符(sizeof)、条件运算符(?:)l运算符在C+中是有优先级规定的,在运算符重载之后,运算符的优先级不会因运算符重载而改变。如

5、果想在重载后改变优先级,那么只有用加括号的形式。l重载不能改变运算符运算对象的个数。在重载操作符的函数中,不能有默认的参数,否则会改变运算符参数的个数。实际上,重载操作符函数有两个参数,重载函数是Complex类中的成员函数,其中有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。8http:/ l最重要的一点是重载操作符必须和用户定义的对象一起使用,在函数中参数至少要有一个类对象或者对象的引用,否则会出现错误。下面的一段语句是错误的。int operator+(int t1,int t2)return(t1/t2);此语句错误在于重载的运算符中的形参没有一个是类对象或者类对

6、象的引用,而是强制地把加的作用更改为除,这种方法是不能使用的。l在类对象运算符的运用上,如类对象之间的加减法,都必须重载操作符,但在C+中有两个运算符是不必重载的,一个是赋值运算符“=”,另一个是取地址运算符“&”。这两个符号是非常特殊的,需要读者特别注意。9http:/ 使用重载操作符【例10-1】使用调用函数来使两复数相加。10http:/ 使用重载操作符11http:/ 使用重载操作符12http:/ 使用重载操作符13http:/ 使用调用函数的方法来实现两个复数相加,此程序中需要注意的有以下几点。(1)在声明实现复数相加的函数时运用到了符号“&”,此符号在这个位置的意思为引用,而不是

7、取地址。(2)在定义对象t1、t2时对其赋值,调用的是重载构造函数,即有参构造函数,定义对象t3时调用的是无参构造函数。(3)程序中有一条语句:t3=plex_add(t2);此语句的意思为:调用定义好的complex_add函数,使两复数相加。(4)在定义两复数相加的函数中,使用到的两条语句为:t.real=this-real+t1.real;t.imag=this-imag+t1.imag;这两条语句中的this-可以省略不写,这两条语句也相当于下面两条语句。14http:/ t.real=t2.real+t1.real;t.imag=t2.imag+t1.imag;(5)在复数相加的函数

8、中,需要特别注意函数的返回值,这里函数的返回值是定义的类对象t,而不是其他的返回值。l 用调用函数的方式来实现两复数的相加很容易出错,看上去也比较繁琐,下面我们再看一个例子,用运算符重载的方法来实现两复数的相加。也请读者对比两个例子的不同之处和体会用运算符重载来实现两复数相加的优点。【例10-2】使用运算符重载来使两复数相加。15http:/ 使用运算符重载来使两复数相加 16http:/ 使用运算符重载来使两复数相加 17http:/ 使用运算符重载来使两复数相加 18http:/ 使用运算符重载来使两复数相加 19http:/ 在【例10-2】的程序中,需要注意的有以下几点:(1)声明运算

9、符重载时很多读者在这里容易把operator和+看成分开的两个部分,这种想法是错误的,应该把“operator+”看成一个整体,因为“operator+”是一个函数名称,它是一个成员函数。(2)程序中重载的“+”运算符是双目运算符,但是函数的参数中只有一个形参。很多读者在这里会产生疑惑,其实这里的形参有两个,只是我们没有写出第一个形参,因为第一个形参是this指针,在程序中也已经写出,所以我们没有写出第一个形参。使用运算符重载的好处有以下几点。使用运算符重载的好处有以下几点。(1)可以使程序更简单易懂,没有非常繁琐的函数定义和调用函数的步骤,而在【例10-1】中,很多读者在调用函数时容易出现错

10、误。(2)若重载了运算符,就可以直接在两个对象之间进行运算,这样相当于很简单的加减乘除运算,为后期检查程序提供了便利。20http:/ 全局操作符和全局变量类似,全局操作符是作用于整个程序的操作符,它在任何地方都可以使用,它可以被任何类成员调用,而无须考虑是否超出了调用的范围。l 一般在C+编程中,建议尽量不要使用全局操作符,因为全局操作符在程序的执行过程中会占用储存单元,而不是在需要时开辟的临时单元。21http:/ 操作符重载和友元的关系 l 在C+中,操作符重载和友元函数有很重要的关系,我们通常把单目运算符重载为成员函数,将双目运算符重载为友元函数。l 运算符重载函数operator+在

11、10.1.3中被作为类中的成员函数,在这里,我们也可以不将重载函数作为类中的成员函数,而是将其作为类的友元函数。运算符重载函数有以下3种的重载形式:(1)作为类的友元函数。(2)作为类的成员函数。(3)既不是类的成员函数,也不是类的友元函数,而是一个普通函数。l 一般不会把运算符重载函数当做普通函数,因为如果类中的数据成员是私有的,那么普通函数将无法直接访问。22http:/ 操作符的重载23 输入和输出操作符的重载 赋值操作符的重载 算术运算符和关系操作符的重载 其他操作符的重载http:/ 输入和输出操作符的重载 在用户自定义了类对象,需要进行运算时,是不能直接使用运算符的,必须经过运算符

12、重载之后才能使用。输入和输出操作符也是一样,若没有经过重载,就不能直接用于输入或输出类中的对象。在很多程序中,为了有一个简单的输入、输出语句,一般会将输入和输出操作符进行重载,重载之后就能直接输入和输出自己声明的数据类型了。【例10-4】输出操作符的重载。24http:/ 输入和输出操作符的重载 25http:/ 输入和输出操作符的重载 26http:/ 输入和输出操作符的重载重载输出操作符的方法如下。istream&operator(istream&,自定义类&);类似地,重载输入操作符的方法如下。ostream&operator(ostream&,自定义类&);27http:/ 输入和输出

13、操作符的重载在上面的程序中,需要注意如下几个方面。(1)在重载输入和输出操作符时,必须让将重载函数作为友元函数或者普通函数,不能把重载函数作为成员函数。(2)在定义重载输入操作符的函数中,第一个形参和函数的类型都必须是istream&,同样的,在重载输出操作符的函数中,第一个形参和函数的类型都必须是ostream&,第二个参数是为了输入和输出自定义类中对象的。(3)在重载输入或输出操作符之后,操作符原有的功能也将保留,只是为运算符增加了一个新的功能,方便用户的输入和输出,无须繁琐地调用输入或输出所需的对象,使程序看更加简洁。28http:/ 输入和输出操作符的重载(4)很多读者会对上面程序中的

14、output产生疑惑,这里的output是运算符重载函数中的形参,它是对ostream类对象的一个引用,读者完全可以把output和cout看成具有相同功能,不一样名字的一个参数。(5)在处理语句“cout t3;”时,实际上是使用已经重载的运算符,此语句相当于调用函数:operator(cout,t3)赋值操作符的种类很多,如=,+=,=,*=,/=,%=,&=,|=,=,=等。一般在编程中最常用到的赋值操作符是“=”。赋值操作符和输入输出操作符一样,都可以被重载,赋值操作符的重载用来对两个对象进行赋值,这也是在对象中应用很广泛的一个方面。29http:/ 赋值操作符的重载【例10-6】重载

15、赋值操作符=30http:/ 赋值操作符的重载 31http:/ 赋值操作符的重载 32http:/ 赋值操作符的重载 33http:/ 赋值操作符的重载 34http:/ 算术运算符和关系操作符的重载算数操作符包括+、-、*、/、%。关系操作符包括=、!=、=。关于算数操作符的重载在前面已经以复数相加的例子进行了说明。只要掌握了算数运算符的重载方法,其他几种就都可以仿照来写,实质上是没有什么区别的。下面重点介绍关系操作符的重载,以相等操作符为例。class Fruitprivate:double price;double weight;string colour;string name;do

16、uble value;35http:/ 算术运算符和关系操作符的重载public:bool operator=(const Fruit&orig)/重载相等操作符return value=orig.value;上面这段语句中包含了相等操作符的重载方法,重载函数是布尔类型的,这里需要注意的是,重载操作符函数后面的形参只有一个。从这里可以看出,每一种操作符重载的大致格式都是相同的,而不同就在于重载函数的形式,重载函数可以作为友元函数、成员函数和普通函数。在这里很多读者会有疑问:是不是关系操作符重载的格式都和重载相等操作符的格式差不多?下面来看两个重载操作符的定义,以解释这个问题。36http:/

17、算术运算符和关系操作符的重载bool operator(const Fruit&orig)/重载小于操作符return value(const Fruit&orig)/重载大于操作符return valueorig.value;实际上在重载各种关系操作符时,重载的格式都是相似的,只要学会一种重载的方法,就能够举一反三,写出其他操作符的重载。37http:/ 其他操作符的重载l 前面已经介绍了大部分操作符的重载,接下来介绍几种特殊的操作符重载:()(调用函数)、-(访问成员)、*(成员指针访问)、,(逗号)、(下标),这几种特殊的操作符重载不是经常用到,但也是重载操作符中很重要的部分。l 这些操

18、作符在类中的重载必须重载为类成员函数,若重载为友元函数或普通函数,程序编译时就会报错。下面给出几种错误的写法。(1)第一种:friend void operator()(int t);void operator()(int t)cout call t endl;38http:/ 其他操作符的重载(2)第二种:friend int&operator(int t);T&operator(int t)cout index t();T*operator-()cout jiantou endl;return ptr;上面的3种错误写法,都是错在把这几种特殊的操作符重载为友元函数。39http:/ 不同类

19、型数据间的转换40 标准类型数据间的转换 用转换构造函数进行类型转换 用类型转换函数进行类型转换http:/ 标准类型数据间的转换标准类型数据之间的转换分为隐式类型转换和显式类型转换两种。1 1)隐式类型转换)隐式类型转换隐式类型转换是指由编译器自动完成的类型转换。例如:int a=2;a=3.5+a;在上面的例子中,系统会将2自动转换成double类型,之后再与第二行中的3.5相加,最后向int型变量a赋值时,程序自动把得到的答案5.5转换成5,并赋值给a,若输出a的值,则此时a的值就为5。2 2)显式类型转换)显式类型转换41http:/ 标准类型数据间的转换l 显式类型转换是用户指定将一

20、种类型转换成另外一种类型的转换方式,如将浮点型变量转换成整型变量。显式转换有固定的形式,其形式如下。类型名(数据)例如,把一个double类型的数据3.5转换成整型的数据,其转换方法如下。int(3.5)这样,就很容易把一种标准数据类型转换成另一种标准数据类型。这样的转换在一些程序中经常用到,在一些关于程序设计的书籍中还有另外一种写法。(int)3.5这种写法是C语言的写法,在这里提出来,是想说明这种写法也没有错,我们可以在程序中把标准类型数据间的转换写成这样。42http:/ 用转换构造函数进行类型的转换l 对于用户自己声明的类型,系统不能自动转换,这就需要用户进行转换。为了解决这个问题,引

21、入了一个新的概念转换构造函数。这个函数的作用是将一个其他类型的数据转换成一个类的对象。转换构造函数是一个新的构造函数,它只有一个形参。例如:Complex(double t)real=r;imag=0;l 此构造函数的作用是将形参t转换为Complex类中的对象,然后将转换后的对象t作为一个复数来处理,对其实部和虚部都赋值。转换构造函数是构造函数的一个重载,所以在类中可以同时存在构造函数和转换构造函数。43http:/ 用转换构造函数进行类型的转换请读者阅读下面语句。Complex(double t)real=r;imag=0;Complex t1(3.5);l这段语句的意思是:建立一个对象t

22、1,将其实部(real)赋值为3.5,虚部(imag)赋值为0。由于只有一个参数,因此调用上面定义的转换构造函数。l实际上转换构造函数就是将一个类型转换成一个类的对象,转换方法也非常简单易懂。比较转换构造函数和标准类型数据间的转换可以发现,数据间的转换方式都基本一样。44http:/ 用转换构造函数进行类型的转换例如:类型名(数据)/标准类型数据间的转换类名(指定类型的数据)/使用转换构造函数进行类型转换下面总结使用转换构造函数进行类型转换的步骤。(1)声明一个类。(2)在类中定义一个只有一个参数的构造函数,即转换构造函数。转换方法为:类名(指定类型的数据)用转换构造函数可以将一个类型的数据转

23、换成一个类的对象,但是如何才能将一个类的对象转换成一个类型的数据呢?为了解决这个问题,C+提供了类型转换函数,类型转换函数的作用是将一个类的对象转换成另一类型的数据。类型转换函数的形式如下:45http:/ 用类型转换函数进行类型转换operator 类型名()实现转换的语句;l 需要注意的是,类型转换函数没有形参,所有转换的方法都是在函数体中定义的。类型转换函数只能作为成员函数,而不能作为友元函数和普通函数。l在具体的程序中,我们可能会遇到定义了两个double型的变量t1和t2,又定义了一个类的变量c,还定义了类型转换函数的情况。例如:t1=t2+c;l这条语句将会被处理成:系统自动调用类型转换函数,将类对象c转换成double类型的数据,然后将其与t2相加后的结果赋值给t1。这样就实现了类对象和double类型数据间的加法,类似于运算符的重载。46http:/ Thanks,

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁