C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt

上传人:b****1 文档编号:14693115 上传时间:2022-10-24 格式:PPT 页数:120 大小:1.32MB
下载 相关 举报
C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt_第1页
第1页 / 共120页
C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt_第2页
第2页 / 共120页
C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt_第3页
第3页 / 共120页
C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt_第4页
第4页 / 共120页
C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt_第5页
第5页 / 共120页
点击查看更多>>
下载资源
资源描述

C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt

《C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt》由会员分享,可在线阅读,更多相关《C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt(120页珍藏版)》请在冰豆网上搜索。

C程序设计语言(李雁妮)第10章PPT课件下载推荐.ppt

C+允许用户在自定义类型时,对语言基本类型的操作符集中的大多数操作符在类中进行重载/过载(Overloading),但前提是它们与基本类型用操作符表示的操作、与其它用户自定义类型用操作符表示的操作之间不存在冲突与二义性(即在某一特定位置上,某一操作符应具有确定的、唯一的含义)。

编译程序判断操作符的定义是否存在冲突与二义性的依据是类型及其类型操作集的定义。

第10章操作符重载10.2操操作作符符重重载载C+允许对大多数基本类型的操作符进行重载。

在用户自定义类型中,C+允许重载定义的操作符是(共计42个):

不允许在用户自定义类型中重载定义的操作符是(共计6个):

第10章操作符重载:

.*?

:

sizeoftypeid此外,C+不允许在自定义类型中重载定义新的操作符,例如不允许在C+中重载定义一个新的操作符*(求幂运算)。

在C+中可采用类内的非静态成员函数或普通函数进行操作符的重载。

C+规定:

在对操作符进行重载时(各种操作符暂以简记),其重载的函数名必须为operator。

例如,对于复数类Complex,我们分别重载了“+”、“*”(利用非静态成员函数重载)和“=”(利用普通函数重载)操作符,则其相应的重载函数名分别为operator+、operator*和operator=。

示例代码如下:

第10章操作符重载当在一个类中定义了重载操作符后,在程序中调用重载定义操作符的方式,既可以是在表达式中直接引用操作符,也可以调用操作符重载函数。

第10章操作符重载除三元操作符外,C+允许对语言基本类型的操作符集中的大部分一元及二元操作符进行重载。

下面我们分别讨论这两种类别操作符的重载。

第10章操作符重载10.2.1二元操作符的重载二元操作符的重载当重载二元操作符时,一般而言,既可以用类的非静态成员函数进行重载(此时参数表中仅需给出第二操作数,第一操作数必须是类类型,且其值*this由系统自动传递),亦可用普通函数进行重载(参数表中需给出参加操作的两个操作数)。

少数操作符除外,它们仅能由类的非静态成员函数重载。

总之,对一个C+允许重载的二元运算符而言,可用类的非静态成员函数或者用普通函数对其进行重载。

同时,亦可以像基本类型一样,允许参加运算的两个操作数的类型不同,因此,在类中可能有一组重载的操作符operator函数,若程序中出现了:

第10章操作符重载aabb/aa,bb分别代表参加运算的两个操作数可被解释成:

aa.operator(bb)/操作符用成员函数重载或operator(aa,bb)/操作符用普通函数重载至于是用类的非静态成员函数重载还是用普通函数重载,这取决于操作符本身的性质(有些操作符必须用类的非静态成员函数重载)及操作数的类型。

假定,一个类X已定义了一组重载的“+”操作符,则程序对“+”的匹配情况如下:

第10章操作符重载第10章操作符重载10.2.2一元操作符的重载一元操作符的重载对于一元操作符而言,像二元操作符一样,不论它是前缀操作符还是后缀操作符,它们既可以用类的非静态成员函数进行重载(没有参数,操作数由系统自动传递*this),亦可以用普通函数进行重载(取一个参数)。

由于C+中的自增、自减运算符有前缀和后缀之分,因此为了区别起见,其前缀用operator()(类的非静态成员函数重载)和operator(操作数)表示(普通函数重载);

后缀用operator(int)(类的非静态成员函数重载)、operator(操作数,int)表示(普通函数重载)。

其中:

int类型的参数仅用于区分前缀与后缀操作,调用时可给一任意整数值。

一元操作符的重载及匹配见下面的示例代码。

第10章操作符重载第10章操作符重载第10章操作符重载从上述示例可看出:

操作符重载时(不论是一元操作符还是二元操作符),一方面要求不能新定义一个操作符;

另一方面要求所重载定义的操作符不仅与原操作符的语法(如参加操作的操作数数目、优先级、结合律等)相吻合,而且亦应与它原有的语义相吻合,即重载定义的操作符只能是原操作符语法、语义在类中的延伸,而不能是对其原有语法、语义的颠覆。

在下面的示例代码中,由于在重载定义操作符时对操作符的语法、语义进行了颠覆,因此导致语法错误。

第10章操作符重载第10章操作符重载在重载操作符时,C+还有一些语法限定,它们是:

(1)重载定义操作符=、()、-时必须用类的非静态成员函数进行重载,以保证其第一操作数一定是左值(lvalue),即一定要保证第一操作数为自定义类的类型。

(2)不允许在重载定义操作符时使得所有操作数都是基本类型,这也就是说,重载定义操作符时至少有一个操作数应是自定义类型。

(3)欲使第一操作数为基本类型的操作符重载,则不能用成员函数重载。

第10章操作符重载10.3类型转换操作符类型转换操作符10.3.1类型转换函数类型转换函数对象参加运算时,像基本类型一样也常常需要类型之间的转换。

一个类型的对象能否转换成其它类型的对象,取决于对象所属的类中是否定义了类型转换函数。

一个类若其构造函数只有一个参数,则该构造函数不仅具有构造函数本身的功能(生成和初始化对象),而且还具有从构造函数的参数类型隐式转换到类类型的功能,即类中具有一个参数的构造函数担当着构造与初始化类对象及类型转换的双重角色。

例如:

第10章操作符重载第10章操作符重载在Xx1=2;

语句中,整型量2首先根据类X提供的类型转换功能,将其转换成X类型,然后再赋给类X的对象x1。

虽然用构造函数实现类型的转换十分方便,但构造函数并不能实现下述两种类型的转换:

(1)从用户自定义类型到基本类型的转换;

(2)自定义类型A到另一个自定义类型B的类型转换。

总之,具有一个参数的构造函数类A只能实现构造函数的参数类型(可为任意类型)到A类型的转换,而不能实现类A到其它类型(基本类型或自定义类型)的转换。

第10章操作符重载C+允许用操作符重载机制进行自定义类型到其它类型的转换(要求用类的非静态成员函数实现),这样的重载函数术语上称为类型转换函数(TypeConversionFunction)。

C+规定一个任意的自定义类A的类型转换函数界面为operatorT()/T为类型(基本类型或自定义类型)名,注意:

函数无返回类型并无实参该函数可实现类A到类型T之间的类型转换。

下面给出一具体实例,来展示类型转换函数的定义、调用方法。

类Tiny是一个非负的且其值域为0,63的整数抽象,它可和整型数进行各种算术运算。

第10章操作符重载第10章操作符重载第10章操作符重载10.3.2歧义性歧义性(二义性二义性)问题问题在一个类中,利用操作符重载机制可能既重载定义了操作符,又定义了类型转换。

例如,在类Tiny中,假设利用普通函数又重载了操作符“+”:

intoperator+(Tiny,Tiny);

则当一个Tiny类型的量和一个int类型的量参加运算时,将出现二义性错误。

voidf(Tinyt,inti)t+i;

/歧义性!

是operator+(t,Tiny(i)还是int(t)+i?

因此,利用操作符重载机制同时进行操作符重载和类型转换函数的定义时要慎重,以免出现歧义性。

第10章操作符重载10.4友友员员类是一个封装体,它对外只暴露接口,隐藏其实现。

但编程中可能出现类A以外的另一个类或函数f需要对类A的私有部分进行访问的情况,从而打破类A的封装性。

C+通过声明类B或函数f是类A的友员类(FriendClass)或友员函数(FriendFunction)来达到上述目的。

声明一个类或函数是另一个类的友员的语法如下:

classA/.friendclassB;

/声明类B是类A的友员类,B的实现可写在类外第10章操作符重载friendintf();

/声明函数f是类A的友员函数,f的实现可写在类外/.;

语法上友员的声明可放置在类A中的任意位置,即可任意放在类中的private、public或protected段中。

友员函数和友员类是一种关于局部破坏封装的机制。

由于C+语言本身无法防止打破封装机制的滥用,因此该机制应慎用。

以Complex类为例,=操作符重载函数(普通函数)由于需要对Complex私有数据成员进行访问,因此,应将它声明为类Complex的友员函数:

第10章操作符重载第10章操作符重载采用友员机制在很多情况下只是不得以而为之的权宜之计,但这种机制的合理使用,可以限定一个类具体到在某个(些)其它类或函数中可见。

例如,应用中需要类A仅对类B和f可见,利用友员机制可实现之。

classA/A对于函数f和类B是不封装的friendvoidf();

friendclassB;

private:

inta1;

voidg();

第10章操作符重载/*注意:

A没有public成员,意味着只有函数f和类B的所有成员函数能够访问A的内容*/;

操作符进行重载时,除了某些特殊的操行符外,大部分的操作符既可以用友员函数重载,亦可以用成员函数重载,那么,我们应如何选择呢?

基本准则是:

(1)需要继承的操作符(后续章节讲述)只能用类的非静态成员函数重载。

(2)二元操作符经常用友员函数重载,特别是返回值类型是bool时。

当既可用友员函数又可用类的非静态成员函数重载操作符时,注意不要重复定义操作符的语义。

第10章操作符重载10.5大大型型对对象象当进行操作符的重载时,有时需要传递大型对象。

因此,当对象的规模很大时(常称为大型对象),如果仍采用值调用和值返回方式来重载定义操作符,就应当考虑运行时复制它们的开销。

另外,若对象的数据成员有指针,则采用值调用和值返回可能导致不期望的结果。

为避免上述两方面的问题,应当考虑采用引用调用和引用返回的方式。

以下给出了大型对象操作符重载的两种实现方案,读者可比较它们的优劣。

第10章操作符重载第10章操作符重载第10章操作符重载10.6类中应具有的基本操作类中应具有的基本操作在类和操作符重载这两种机制的支持下,我们有了设计和实现在表现形式、使用方式等方面与C+基本类型具有同等地位的自定义类型的权利。

相对于传统程序设计语言而言,这种权利是非同寻常的。

然而,这种权力的赋予并不意味着我们只要用一个类来定义某个自定义类型、用一些成员函数或重载的操作符来定义该自定义类型上的常用操作,就一定能够使这个自定义类型像基本类型那样完备和坚固,当然不是!

第10章操作符重载我们还应继续深入地理解与利用类和操作符重载这两种机制,在自定义类型中提供更多的、类似于基本类型那样的支持。

一般而言

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

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1