面向对象程序设计教程(C++语言描述)下ppt.ppt

上传人(卖家):三亚风情 文档编号:3385514 上传时间:2022-08-26 格式:PPT 页数:220 大小:529KB
下载 相关 举报
面向对象程序设计教程(C++语言描述)下ppt.ppt_第1页
第1页 / 共220页
面向对象程序设计教程(C++语言描述)下ppt.ppt_第2页
第2页 / 共220页
面向对象程序设计教程(C++语言描述)下ppt.ppt_第3页
第3页 / 共220页
面向对象程序设计教程(C++语言描述)下ppt.ppt_第4页
第4页 / 共220页
面向对象程序设计教程(C++语言描述)下ppt.ppt_第5页
第5页 / 共220页
点击查看更多>>
资源描述

1、第第4章章 继承机制继承机制面向对象程序设计教程(面向对象程序设计教程(C+语言描述)下语言描述)下第第4章章 继承机制继承机制第第4章章 继承机制继承机制4.1 基类和派生类基类和派生类4.2 单继承单继承4.3 派生类的访问控制派生类的访问控制4.4 多继承多继承4.5 继承机制下的构造函数与析构函数继承机制下的构造函数与析构函数4.6 应用实例应用实例第第4章章 继承机制继承机制4.1 基类和派生类基类和派生类返回首页返回首页4.1.1 继承和派生的基本概念继承和派生的基本概念4.1.2 继承的种类继承的种类第第4章章 继承机制继承机制4.1.1 继承和派生的基本概念继承和派生的基本概念

2、 通过继承机制,可以利用已有的数据类型通过继承机制,可以利用已有的数据类型来定义新的数据类型来定义新的数据类型。根据一个类创建一个新类的过程称为继承,根据一个类创建一个新类的过程称为继承,也称派生。新类自动具有原有类的成员,根据也称派生。新类自动具有原有类的成员,根据需要还可以增加新成员需要还可以增加新成员。派生新类的类称为基类,又称父类,而将派生新类的类称为基类,又称父类,而将派生出来的新类称为派生类,又称子类派生出来的新类称为派生类,又称子类。第第4章章 继承机制继承机制4.1.1 继承和派生的基本概念继承和派生的基本概念 从现存类中派生出新类时,可以对派生类从现存类中派生出新类时,可以对

3、派生类做如下几种变化:做如下几种变化:增加新的成员变量增加新的成员变量增加新的成员函数增加新的成员函数重新定义已有的成员函数重新定义已有的成员函数改变现有成员的属性改变现有成员的属性返回本节返回本节第第4章章 继承机制继承机制4.1.2 继承的种类继承的种类 一个派生类既可以从一个基类派生,也可一个派生类既可以从一个基类派生,也可以从多个基类派生。以从多个基类派生。从一个基类派生的继承被称为单继承。单从一个基类派生的继承被称为单继承。单继承形成的类层次是一个倒挂的树。继承形成的类层次是一个倒挂的树。从多个基类派生类的继承被称为多继承。从多个基类派生类的继承被称为多继承。多继承形成的类层次是一个

4、有向无环图。多继承形成的类层次是一个有向无环图。返回本节返回本节第第4章章 继承机制继承机制4.2 单继承单继承 C+有两种继承:单继承和多继承,无论有两种继承:单继承和多继承,无论哪种继承,都有公有继承、私有继承和保护继哪种继承,都有公有继承、私有继承和保护继承承3种继承方式。不同继承方式,派生类对基类种继承方式。不同继承方式,派生类对基类成员拥有不同的访问权限。成员拥有不同的访问权限。在在C+中,单一继承的一般形式为:中,单一继承的一般形式为:第第4章章 继承机制继承机制4.2 单继承单继承class派生类名:继承方式基类名派生类名:继承方式基类名 public:protected:pri

5、vate:;第第4章章 继承机制继承机制4.2 单继承单继承继承方式继承方式有有三种三种:public 表示公有继承方式表示公有继承方式private 表示私有继承方式表示私有继承方式protected 表示保护继承方式表示保护继承方式缺省情况下为私有继承方式。缺省情况下为私有继承方式。第第4章章 继承机制继承机制4.2 单继承单继承【例【例4.1】公有继承方式单继承的例子。阅读程】公有继承方式单继承的例子。阅读程序,了解继承和派生类的基本概念,熟悉单继序,了解继承和派生类的基本概念,熟悉单继承的定义格式。承的定义格式。返回首页返回首页第第4章章 继承机制继承机制4.3 派生类的访问控制派生类

6、的访问控制返回首页返回首页4.3.1 公有继承公有继承4.3.2 私有继承私有继承4.3.3 保护继承保护继承第第4章章 继承机制继承机制4.3.1 公有继承公有继承 类的派生可以分成公有继承、私有继承和类的派生可以分成公有继承、私有继承和保护继承保护继承3 3种。基类成员在派生类中的访问权种。基类成员在派生类中的访问权限与继承方式及基类成员本身被声明的访问权限与继承方式及基类成员本身被声明的访问权限有关。限有关。继承中有一种新的访问权限:不可访问。继承中有一种新的访问权限:不可访问。第第4章章 继承机制继承机制4.3.1 公有继承公有继承 公有继承时,在派生类中,基类的公有成公有继承时,在派

7、生类中,基类的公有成员和保护成员被继承后分别作为派生类的公有员和保护成员被继承后分别作为派生类的公有成员和保护成员。成员和保护成员。公有派生时,可以通过定义派生类自己的公有派生时,可以通过定义派生类自己的成员函数来访问派生类继承来的公有和保护成成员函数来访问派生类继承来的公有和保护成员,但不能访问继承来的私有成员。员,但不能访问继承来的私有成员。第第4章章 继承机制继承机制4.3.1 公有继承公有继承赋值兼容规则:是指在公有继承情况下,一赋值兼容规则:是指在公有继承情况下,一个派生类的对象可以作为基类的对象来使用个派生类的对象可以作为基类的对象来使用的地方。的地方。三种情况:三种情况:派生类的

8、对象可以赋给基类的对象派生类的对象可以赋给基类的对象例如:例如:DerivedClass d;BaseClass b;b=d;第第4章章 继承机制继承机制4.3.1 公有继承公有继承派生类的对象可以初始化基类的引用派生类的对象可以初始化基类的引用例如:例如:DerivedClass d;BaseClass&br=d;派生类的对象的地址可以赋给指向基类的派生类的对象的地址可以赋给指向基类的指针指针例如:例如:DerivedClass d;BaseClass*pb=&d;返回本节返回本节第第4章章 继承机制继承机制4.3.2 私私有继承有继承 私有继承时,在派生类中,基类的公私有继承时,在派生类中

9、,基类的公有成员和保护成员作为派生类的私有成员,有成员和保护成员作为派生类的私有成员,派生类的成员函数可以直接访问它们,而派派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成生类的成员函数无法直接访问基类的私有成员。在类外部,派生类的对象无法访问基类员。在类外部,派生类的对象无法访问基类的所有成员。的所有成员。第第4章章 继承机制继承机制4.3.2 私私有继承有继承把例把例4.1修改为修改为Point类私有继承类私有继承Circle类:类:按下面修改代码,其它部分不变。按下面修改代码,其它部分不变。第第4章章 继承机制继承机制4.3.2 私私有继承有继承/定义派生类,

10、私有继承方式定义派生类,私有继承方式class Circle:private Point public:void setr(int myx,int myy,int myr)setxy(myx,myy);R=myr;void display();protected:int R;第第4章章 继承机制继承机制4.3.2 私私有继承有继承编译程序,发现主函数中语句编译程序,发现主函数中语句c.movexy(7,8);出错。私有继承使出错。私有继承使Point类中的公有成员函类中的公有成员函数数movexy()的性质发生了变化。的性质发生了变化。在派生类在派生类Circle中增加新的外部接口,中增加新的

11、外部接口,代码如下:代码如下:返回本节返回本节第第4章章 继承机制继承机制4.3.3 保护保护继承继承【例【例4.2】演示保护继承】演示保护继承第第4章章 继承机制继承机制4.3.3 保护保护继承继承返回本节返回本节继承方式继承方式基类成员基类成员在子类中在子类中访问权限访问权限子类内部子类内部模块访问性模块访问性子类对象子类对象访问性访问性公有继承公有继承公有成员公有成员保护成员保护成员私有成员私有成员公有的公有的保护的保护的不可访问不可访问可以访问可以访问可以访问可以访问不可访问不可访问可以访问可以访问不可访问不可访问不可访问不可访问私有继承私有继承公有成员公有成员保护成员保护成员私有成员

12、私有成员私有成员私有成员私有成员私有成员不可访问不可访问可以访问可以访问可以访问可以访问不可访问不可访问不可访问不可访问不可访问不可访问不可访问不可访问保护继承保护继承公有成员公有成员保护成员保护成员私有成员私有成员保护的保护的保护的保护的不可访问不可访问可以访问可以访问可以访问可以访问不可访问不可访问不可访问不可访问不可访问不可访问不可访问不可访问第第4章章 继承机制继承机制4.4 多继承多继承返回首页返回首页4.4.1 多继承的定义格式多继承的定义格式4.4.2 二义性和支配规则二义性和支配规则4.4.3 虚基类虚基类第第4章章 继承机制继承机制4.4.1 多继承的定义格式多继承的定义格式

13、一个类从多个基类派生的一般形式是:一个类从多个基类派生的一般形式是:classclass派生类名:继承方式基类名派生类名:继承方式基类名1 1,继承方式基类名,继承方式基类名n n 定义派生类自己的成员定义派生类自己的成员;第第4章章 继承机制继承机制4.4.1 多继承的定义格式多继承的定义格式【例【例4.34.3】阅读程序,了解多继承的定义格】阅读程序,了解多继承的定义格式,进一步熟悉基类成员在派生类中的访问式,进一步熟悉基类成员在派生类中的访问权限。权限。返回本节返回本节第第4章章 继承机制继承机制4.4.2 二义性和支配规则二义性和支配规则 多继承时,可能会造成派生类对基类成员多继承时,

14、可能会造成派生类对基类成员访问的不唯一性,即二义性。访问的不唯一性,即二义性。1.调用不同基类的相同成员时可能出现二义性调用不同基类的相同成员时可能出现二义性【例【例4.44.4】下面程序调用了不同基类的相同成员,】下面程序调用了不同基类的相同成员,分析程序中出现的二义性。分析程序中出现的二义性。第第4章章 继承机制继承机制4.4.2 二义性和支配规则二义性和支配规则 主函数主函数main()的语句的语句obj.show()中,中,对象对象obj调用哪个调用哪个show()函数存在二义性。函数存在二义性。若要消除二义性若要消除二义性:使用作用域运算符使用作用域运算符例如:例如:obj.Base

15、class1:show();obj.Baseclass2:show();第第4章章 继承机制继承机制4.4.2 二义性和支配规则二义性和支配规则通过在派生类通过在派生类Derivedclass中定义一个新函中定义一个新函数数show()例例如:如:void Derivedclass:show()Baseclass1:show();Baseclass2:show();第第4章章 继承机制继承机制4.4.2 二义性和支配规则二义性和支配规则 类类X中的名字中的名字N支配类支配类Y中同名的名字中同名的名字N,是指类是指类X以类以类Y为它的一个基类,这被称为支为它的一个基类,这被称为支配规则。配规则。

16、Baseclass1a,seta(),show()Baseclass2 b,setb(),show()Derivedclassc,show()第第4章章 继承机制继承机制4.4.2 二义性和支配规则二义性和支配规则2.访问共同基类的成员时可能出现二义性访问共同基类的成员时可能出现二义性 如果一个派生类从多个基类派生,而这如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在这个派生类些基类又有一个共同的基类,则在这个派生类中访问这个共同的基类中的成员时可能会产生中访问这个共同的基类中的成员时可能会产生二义性。二义性。【例【例4.5】下面程序访问了共同基类的成员,】下面程序访问了共同基

17、类的成员,分析程序中出现的二义性。分析程序中出现的二义性。第第4章章 继承机制继承机制4.4.2 二义性和支配规则二义性和支配规则BasevalBasevalBaseclass1seta()Baseclass2setb()Derivedclassshow()第第4章章 继承机制继承机制4.4.2 二义性和支配规则二义性和支配规则 从图可以看出,从图可以看出,Derivedclass的对象包含基的对象包含基类类Base的两个基类子对象:一个是由的两个基类子对象:一个是由Baseclass1路径产生的,另一个是由路径产生的,另一个是由Baseclass2路径产生的。路径产生的。【例【例4.6】示例

18、】示例Derivedclass的对象包含基类的对象包含基类Base的两个基类子对象的两个基类子对象第第4章章 继承机制继承机制4.4.2 二义性和支配规则二义性和支配规则 由于二义性原因,一个类不能从同一个由于二义性原因,一个类不能从同一个类中直接继承一次以上。如果必须这样做,类中直接继承一次以上。如果必须这样做,可以使用一个中间类。可以使用一个中间类。二义性检查是在访问权限检查之前进行二义性检查是在访问权限检查之前进行的,因此,成员的访问权限是不能解决两义的,因此,成员的访问权限是不能解决两义性问题的。性问题的。返回本节返回本节第第4章章 继承机制继承机制4.4.3 虚基类虚基类 引进虚基类

19、的目的是为了解决二义性问题,引进虚基类的目的是为了解决二义性问题,使得公共基类在它的派生类对象中只产生一个使得公共基类在它的派生类对象中只产生一个基类子对象。基类子对象。虚基类说明格式如下:虚基类说明格式如下:virtual 其中,其中,virtual是说明虚基类的关键字。虚基是说明虚基类的关键字。虚基类的说明是用在定义派生类时,写在派生类名类的说明是用在定义派生类时,写在派生类名的后面。的后面。例如:例如:第第4章章 继承机制继承机制4.4.3 虚基类虚基类class Baseclass1:visual public Base public:void seta(int x)val=x;cla

20、ss Baseclass2:visual public Base public:void setb(int x)val=x;第第4章章 继承机制继承机制4.4.3 虚基类虚基类BasevalBaseclass1seta()Baseclass2setb()Derivedclassshow()返回本节返回本节第第4章章 继承机制继承机制4.5 继承机制下的构造函数与析构函数继承机制下的构造函数与析构函数返回首页返回首页4.5.1 继承机制下构造函数的调用顺序继承机制下构造函数的调用顺序4.5.2 派生类构造函数的规则派生类构造函数的规则4.5.3 继承机制下析构函数的调用顺序继承机制下析构函数的调

21、用顺序第第4章章 继承机制继承机制4.5.1 继承机制下构造函数的调用顺序继承机制下构造函数的调用顺序派生类名:派生类名(总参数派生类名:派生类名(总参数表):基类名表):基类名1(参数表(参数表1),),基类名基类名n(参数表(参数表n)派生类中数据成员初始化派生类中数据成员初始化;第第4章章 继承机制继承机制4.5.1 继承机制下构造函数的调用顺序继承机制下构造函数的调用顺序1.单继承机制下构造函数的调用顺序单继承机制下构造函数的调用顺序 当说明派生类的一个对象时,首先调用基当说明派生类的一个对象时,首先调用基类的构造函数,对基类成员进行初始化,然后类的构造函数,对基类成员进行初始化,然后

22、执行派生类的构造函数,如果某个基类仍是一执行派生类的构造函数,如果某个基类仍是一个派生类,则这个过程递归进行。个派生类,则这个过程递归进行。【例【例4.74.7】分析程序的输出结果,理解继承中】分析程序的输出结果,理解继承中构造函数的调用顺序。构造函数的调用顺序。第第4章章 继承机制继承机制4.5.1 继承机制下构造函数的调用顺序继承机制下构造函数的调用顺序【例【例4.8】分析程序的输出结果,理解派生类包】分析程序的输出结果,理解派生类包括子对象时,其构造函数的调用顺序。括子对象时,其构造函数的调用顺序。第第4章章 继承机制继承机制4.5.1 继承机制下构造函数的调用顺序继承机制下构造函数的调

23、用顺序2多继承机制下构造函数的调用顺序多继承机制下构造函数的调用顺序 多继承方式下派生类的构造函数须同时负多继承方式下派生类的构造函数须同时负责该派生类所有基类构造函数的调用责该派生类所有基类构造函数的调用。构造函数调用顺序是:先调用所有基类的构造函数调用顺序是:先调用所有基类的构造函数,再调用派生类的构造函数构造函数,再调用派生类的构造函数。处于同一层次的各基类构造函数的调用顺处于同一层次的各基类构造函数的调用顺序取决于定义派生类所指定的基类顺序,与派序取决于定义派生类所指定的基类顺序,与派生类构造函数中所定义的成员初始化列表顺序生类构造函数中所定义的成员初始化列表顺序无关无关。第第4章章

24、继承机制继承机制4.5.1 继承机制下构造函数的调用顺序继承机制下构造函数的调用顺序【例【例4.9】分析程序的输出结果,理解多继承方】分析程序的输出结果,理解多继承方式下构造函数的调用顺序。式下构造函数的调用顺序。第第4章章 继承机制继承机制4.5.1 继承机制下构造函数的调用顺序继承机制下构造函数的调用顺序【例【例4.10】分析程序的输出结果,理解有虚基类】分析程序的输出结果,理解有虚基类时,多继承方式下构造函数的调用顺序。时,多继承方式下构造函数的调用顺序。第第4章章 继承机制继承机制4.5.1 继承机制下构造函数的调用顺序继承机制下构造函数的调用顺序返回本节返回本节第第4章章 继承机制继

25、承机制4.5.2 派生类构造函数的调用规则派生类构造函数的调用规则分四种情况讨论派生类构造函数的规则:分四种情况讨论派生类构造函数的规则:u 若派生类有构造函数而基类没有,当创建若派生类有构造函数而基类没有,当创建派生类的对象时,派生类的相应构造函数被自派生类的对象时,派生类的相应构造函数被自动调用。动调用。u若派生类没有构造函数而基类有,则基类必若派生类没有构造函数而基类有,则基类必须拥有缺省构造函数。只有这样,当创建派生须拥有缺省构造函数。只有这样,当创建派生类的对象时,才能自动执行基类的默认构造函类的对象时,才能自动执行基类的默认构造函数。数。第第4章章 继承机制继承机制4.5.2 派生

26、类构造函数的调用规则派生类构造函数的调用规则u 若派生类有构造函数,且基类有缺省构造若派生类有构造函数,且基类有缺省构造函数,则创建派生类的对象时,基类的缺省构函数,则创建派生类的对象时,基类的缺省构造函数会自动执行,除非当前被调用的派生类造函数会自动执行,除非当前被调用的派生类构造函数在其初始化段中显式地调用了基类的构造函数在其初始化段中显式地调用了基类的有参构造函数。有参构造函数。u 若派生类和基类都有构造函数,但基类没若派生类和基类都有构造函数,但基类没有缺省构造函数,则派生类的每一个构造函数有缺省构造函数,则派生类的每一个构造函数必须在其初始化列表中显式地调用基类的某个必须在其初始化列

27、表中显式地调用基类的某个构造函数。只有这样,当创建派生类的对象时,构造函数。只有这样,当创建派生类的对象时,基类的构造函数才能获得执行机会。基类的构造函数才能获得执行机会。第第4章章 继承机制继承机制4.5.2 派生类构造函数的调用规则派生类构造函数的调用规则第一种情况:若派生类有构造函数而基类没有,第一种情况:若派生类有构造函数而基类没有,当创建派生类的对象时,派生类的相应构造函当创建派生类的对象时,派生类的相应构造函数被自动调用。数被自动调用。【例【例4.11】分析程序,讨论派生类有构造函数,】分析程序,讨论派生类有构造函数,基类没有构造函数时,派生类构造函数的规则。基类没有构造函数时,派

28、生类构造函数的规则。第第4章章 继承机制继承机制4.5.2 派生类构造函数的调用规则派生类构造函数的调用规则第二种情况:若派生类没有构造函数而基类有,第二种情况:若派生类没有构造函数而基类有,则基类必须拥有缺省构造函数。只有这样,当创则基类必须拥有缺省构造函数。只有这样,当创建派生类的对象时,才能自动执行基类的默认构建派生类的对象时,才能自动执行基类的默认构造函数。造函数。【例【例4.12】分析程序,讨论派生类无构造函数,】分析程序,讨论派生类无构造函数,基类有构造函数时,派生类构造函数的规则。基类有构造函数时,派生类构造函数的规则。第第4章章 继承机制继承机制4.5.2 派生类构造函数的调用

29、规则派生类构造函数的调用规则第三种情况:若派生类有构造函数,且基类有缺省第三种情况:若派生类有构造函数,且基类有缺省构造函数,则创建派生类的对象时,基类的缺省构构造函数,则创建派生类的对象时,基类的缺省构造函数会自动执行,除非当前被调用的派生类构造造函数会自动执行,除非当前被调用的派生类构造函数在其初始化段中显式地调用了基类的有参构造函数在其初始化段中显式地调用了基类的有参构造函数。函数。【例【例4.13】分析程序,讨论派生类有构造函数,基】分析程序,讨论派生类有构造函数,基类有缺省构造函数时,派生类构造函数的规则。类有缺省构造函数时,派生类构造函数的规则。第第4章章 继承机制继承机制4.5.

30、2 派生类构造函数的调用规则派生类构造函数的调用规则第四种情况:若派生类和基类都有构造函数,但基第四种情况:若派生类和基类都有构造函数,但基类没有缺省构造函数,则派生类的每一个构造函数类没有缺省构造函数,则派生类的每一个构造函数必须在其初始化列表中显式地调用基类的某个构造必须在其初始化列表中显式地调用基类的某个构造函数。只有这样,当创建派生类的对象时,基类的函数。只有这样,当创建派生类的对象时,基类的构造函数才能获得执行机会。构造函数才能获得执行机会。【例【例4.14】分析程序,讨论派生类有构造函数,基】分析程序,讨论派生类有构造函数,基类无缺省构造函数时,派生类构造函数的规则。类无缺省构造函

31、数时,派生类构造函数的规则。第第4章章 继承机制继承机制4.5.2 派生类构造函数的调用规则派生类构造函数的调用规则返回本节返回本节第第4章章 继承机制继承机制4.5.3 继承机制下析构函数的调用顺序继承机制下析构函数的调用顺序 由于析构函数不能被继承,因此在执行由于析构函数不能被继承,因此在执行派生类的析构函数时,也要调用基类的析构派生类的析构函数时,也要调用基类的析构函数。其执行顺序如下:函数。其执行顺序如下:先调用派生类的析构函数先调用派生类的析构函数再调用派生类中子对象类的析构函数再调用派生类中子对象类的析构函数(如果派生类中有子对象)(如果派生类中有子对象)再调用普通基类的析构函数再

32、调用普通基类的析构函数最后调用虚基类的析构函数最后调用虚基类的析构函数第第4章章 继承机制继承机制4.5.3 继承机制下析构函数的调用顺序继承机制下析构函数的调用顺序【例【例4.15】给例】给例4.8中所有类增加析构函数,分中所有类增加析构函数,分析程序的输出结果,理解派生类析构函数的调用析程序的输出结果,理解派生类析构函数的调用顺序。顺序。第第4章章 继承机制继承机制4.5.3 继承机制下析构函数的调用顺序继承机制下析构函数的调用顺序返回本节返回本节第第4章章 继承机制继承机制4.6 应用实例应用实例 返回首页返回首页定义一个点类(定义一个点类(Point)、圆类()、圆类(Circle)和

33、圆)和圆柱体类(柱体类(Cylinder)的层次结构。圆包括圆心)的层次结构。圆包括圆心和半径两个数据成员,圆心具有点类的所有特和半径两个数据成员,圆心具有点类的所有特征。圆柱体类由半径和高构成。要求各类提供征。圆柱体类由半径和高构成。要求各类提供支持初始化的构造函数和显示自己成员的成员支持初始化的构造函数和显示自己成员的成员函数。编写主函数,测试这个层次结构,输出函数。编写主函数,测试这个层次结构,输出圆柱体类的相关信息。圆柱体类的相关信息。目的:理解单继承中的保护成员的作用,掌握目的:理解单继承中的保护成员的作用,掌握单继承的使用。单继承的使用。第第4章章 继承机制继承机制第第6章章 运算

34、符重载运算符重载6.1 运算符重载的规则运算符重载的规则6.2 运算符重载的形式运算符重载的形式6.3 基本运算符重载基本运算符重载6.4 赋值运算符重载赋值运算符重载6.5 特殊运算符重载特殊运算符重载6.6 类类型转换运算符重载类类型转换运算符重载6.7 应用实例应用实例第第4章章 继承机制继承机制6.1 运算符重载的规则运算符重载的规则返回首页返回首页6.1.1 运算符重载的规则运算符重载的规则6.1.2 编译程序选择重载运算符的规则编译程序选择重载运算符的规则第第4章章 继承机制继承机制6.1.1 运算符重载的规则运算符重载的规则运算符重载就是赋予已有的运算符多重含义。运算符重载就是赋

35、予已有的运算符多重含义。例如:例如:a=3+4a=3+4;a=”abc”+”defa=”abc”+”def”;”;同一个运算符同一个运算符“”,由于所操作的数据类型,由于所操作的数据类型不同而具有不同的意义,这就是运算符重载,不同而具有不同的意义,这就是运算符重载,而且是系统预先定义的运算符重载。而且是系统预先定义的运算符重载。第第4章章 继承机制继承机制6.1.1 运算符重载的规则运算符重载的规则重载运算符必须遵循下列规则:重载运算符必须遵循下列规则:(1)(1)重载运算符必须符合语言语法。重载运算符必须符合语言语法。例如,不能在例如,不能在C+C+中这样写:中这样写:float f;flo

36、at f;3.14=f;3.14=f;因此,不能重载因此,不能重载“=”=”运算符来做下面操作:运算符来做下面操作:Complex c;Complex c;3.14+6i=c;3.14+6i=c;第第4章章 继承机制继承机制6.1.1 运算符重载的规则运算符重载的规则(2)(2)不能重载对内部不能重载对内部C+C+数据类型进行操作数据类型进行操作的运算符。的运算符。例如,不能重载二元浮点减法运算符。例如,不能重载二元浮点减法运算符。(3)(3)不能创建新的运算符。不能创建新的运算符。(4)(4)不能重载下面运算符:不能重载下面运算符:.类成员选择运算符类成员选择运算符 .*成员指针运算符成员指

37、针运算符 :作用域运算符作用域运算符?:?:条件表达式运算符条件表达式运算符除此之外的运算符都可以被重载,并且只有除此之外的运算符都可以被重载,并且只有“=”=”的重载函数不能被继承。的重载函数不能被继承。第第4章章 继承机制继承机制6.1.1 运算符重载的规则运算符重载的规则(5)(5)重载运算符要保持原有的基本语义不变。重载运算符要保持原有的基本语义不变。从技术上讲,可以任意进行运算符重载,从技术上讲,可以任意进行运算符重载,但是,如果脱离原有语义太远,就会使程序造但是,如果脱离原有语义太远,就会使程序造成混乱,所以最好坚持如下的成混乱,所以最好坚持如下的4 4个个“不能改变不能改变”:不

38、能改变运算符操作数的个数不能改变运算符操作数的个数 不能改变运算符原有的优先级不能改变运算符原有的优先级 不能改变运算符原有的结合性不能改变运算符原有的结合性 不能改变运算符原有的语法结构不能改变运算符原有的语法结构返回本节返回本节第第4章章 继承机制继承机制6.1.2 编译程序选择重载运算符的规则编译程序选择重载运算符的规则 运算符重载实际是一个函数,所以运算符运算符重载实际是一个函数,所以运算符的重载实际上是函数的重载。的重载实际上是函数的重载。编译程序对运算符重载的选择,遵循着函编译程序对运算符重载的选择,遵循着函数重载的选择原则。当遇到不很明显的运算时,数重载的选择原则。当遇到不很明显

39、的运算时,编译程序将去寻找参数相匹配的运算符函数。编译程序将去寻找参数相匹配的运算符函数。返回本节返回本节第第4章章 继承机制继承机制6.2 运算符重载的形式运算符重载的形式返回首页返回首页6.2.1 用成员函数重载运算符用成员函数重载运算符6.2.2 用友员函数重载运算符用友员函数重载运算符6.2.3 两种运算符重载形式的比较两种运算符重载形式的比较第第4章章 继承机制继承机制6.2.1 用成员函数重载运算符用成员函数重载运算符用成员函数重载运算符:用成员函数重载运算符:返回值类型返回值类型operator运算符(形式参数表)运算符(形式参数表)返回类型可以为任何有效类型,但通常返回它们返回

40、类型可以为任何有效类型,但通常返回它们操作类的对象。运算符为要重载的运算符,操作类的对象。运算符为要重载的运算符,形式参数表中的参数个数与重载的运算符操形式参数表中的参数个数与重载的运算符操作数的个数有关。作数的个数有关。返回本节返回本节第第4章章 继承机制继承机制6.2.2 用友员函数重载运算符用友员函数重载运算符用友员函数重载运算符的原型为:用友员函数重载运算符的原型为:friend 返回值类型返回值类型operator运算符(形式参数表)运算符(形式参数表)返回本节返回本节第第4章章 继承机制继承机制6.2.3 两种运算符重载形式的比较两种运算符重载形式的比较 用友元或成员函数重载运算符

41、在功能上没有什么用友元或成员函数重载运算符在功能上没有什么区别。有时将二元运算符重载为友元函数比重载为一区别。有时将二元运算符重载为友元函数比重载为一个成员函数使用起来更灵活。例如:个成员函数使用起来更灵活。例如:c=34.5+c1;如果如果“+”用成员函数重载,编译时会出错。因为该语用成员函数重载,编译时会出错。因为该语句右边的表达式被解释为:句右边的表达式被解释为:34.5.operator+(c1);由于由于34.5是是float型数据型数据,不能进行不能进行“.”操作。解决这个操作。解决这个问题的办法就是用用友元函数而不是成员函数重载加问题的办法就是用用友元函数而不是成员函数重载加法。

42、这时,该语句右边的表达式被解释为:法。这时,该语句右边的表达式被解释为:operator+(34.5,c1);两个变元都被显式传给运算符函数。两个变元都被显式传给运算符函数。第第4章章 继承机制继承机制6.2.3 两种运算符重载形式的比较两种运算符重载形式的比较重载为友元函数的一些限制:重载为友元函数的一些限制:为保持与为保持与C+中规定的赋值语义相一致,赋中规定的赋值语义相一致,赋值运算符虽然它是一个二元操作符,但不能重值运算符虽然它是一个二元操作符,但不能重载为友员函数。同样,也应将载为友员函数。同样,也应将+=、=等这些等这些赋值运算符重载为成员函数。赋值运算符重载为成员函数。友元函数不

43、能重载友元函数不能重载()、和、和-运算符。运算符。在重载增量或减量运算符时,若使用友元函在重载增量或减量运算符时,若使用友元函数,则需要使用引用参数。数,则需要使用引用参数。返回本节返回本节第第4章章 继承机制继承机制6.3 基本运算符重载基本运算符重载6.3.1 单目运算符重载单目运算符重载6.3.2 双目运算符重载双目运算符重载返回首页返回首页第第4章章 继承机制继承机制1用成员函数形式重载运算符用成员函数形式重载运算符+和和以成员函数方式重载前缀以成员函数方式重载前缀“+”运算符:运算符:类型类名:类型类名:operator+();以成员函数方式重载后缀以成员函数方式重载后缀“+”运算

44、符的函数:运算符的函数:类型类名:类型类名:operator+(int);6.3.1 单目运算符重载单目运算符重载第第4章章 继承机制继承机制【例【例6.1】用成员函数重载运算符】用成员函数重载运算符+和和6.3.1 单目运算符重载单目运算符重载第第4章章 继承机制继承机制2用友元函数形式重载运算符用友元函数形式重载运算符+和和以友元函数方式重载前缀以友元函数方式重载前缀“+”运算符运算符:类型类型operator+(类名类名);以友元方式重载后缀以友元方式重载后缀“+”运算符运算符:类型类型operator+(类名类名a,i nt);6.3.1 单目运算符重载单目运算符重载第第4章章 继承机

45、制继承机制【例【例6.2】用友元函数重载运算符】用友元函数重载运算符+和和6.3.1 单目运算符重载单目运算符重载第第4章章 继承机制继承机制6.3.1 单目运算符重载单目运算符重载返回本节返回本节第第4章章 继承机制继承机制【例【例6.3】用成员函数重载运算符,实现复数】用成员函数重载运算符,实现复数的二元加法、减法运算。的二元加法、减法运算。6.3.2 双目运算符重载双目运算符重载第第4章章 继承机制继承机制【例【例6.4】用友元函数重载运算符,实现复数】用友元函数重载运算符,实现复数的二元加法、减法运算。的二元加法、减法运算。6.3.2 双目运算符重载双目运算符重载第第4章章 继承机制继

46、承机制6.3.2 双目运算符重载双目运算符重载返回本节返回本节第第4章章 继承机制继承机制6.4 赋值运算符重载赋值运算符重载返回首页返回首页6.4.1 浅拷贝与深拷贝浅拷贝与深拷贝6.4.2 重载赋值运算符的格式重载赋值运算符的格式6.4.3 重载赋值运算符函数的返回值重载赋值运算符函数的返回值6.4.4 赋值运算符重载函数与拷贝构造函数的区别赋值运算符重载函数与拷贝构造函数的区别第第4章章 继承机制继承机制6.4.1 浅拷贝与深拷贝浅拷贝与深拷贝 如果一个类的数据成员中有指向动态分配空如果一个类的数据成员中有指向动态分配空间的指针,通常应该定义拷贝构造函数,并重载间的指针,通常应该定义拷贝

47、构造函数,并重载赋值运算符,否则会出现运行错误。赋值运算符,否则会出现运行错误。【例【例6.5】分析下列程序中存在的问题。】分析下列程序中存在的问题。第第4章章 继承机制继承机制6.4.1 浅拷贝与深拷贝浅拷贝与深拷贝返回本节返回本节第第4章章 继承机制继承机制6.4.2 重载赋值运算符的格式重载赋值运算符的格式对赋值运算符进行重载的类成员函数对赋值运算符进行重载的类成员函数“构架构架”大致如下:大致如下:Classname&Classname:operator=(Classname obj)/Classname为某个类名为某个类名,用于完成调用者对象与形参对象的赋值操作用于完成调用者对象与形

48、参对象的赋值操作if(this!=&obj)delete dobj;/释放调用者对象释放调用者对象dobj已经分配到的动态存储空间已经分配到的动态存储空间 使用使用new为调用者对象分配与形参为调用者对象分配与形参obj对象同样大小的动态存储空间;对象同样大小的动态存储空间;将形参将形参obj对象的动态存储空间中的数据赋给调用者对象;对象的动态存储空间中的数据赋给调用者对象;return*this;/返回调用者对象返回调用者对象第第4章章 继承机制继承机制6.4.2 重载赋值运算符的格式重载赋值运算符的格式【例【例6.6】重载赋值运算符,使例重载赋值运算符,使例6.5正确正确运行,并完善它。运

49、行,并完善它。第第4章章 继承机制继承机制6.4.2 重载赋值运算符的格式重载赋值运算符的格式返回本节返回本节第第4章章 继承机制继承机制6.4.3 重载赋值运算符函数的返回值重载赋值运算符函数的返回值 重载赋值运算符时,通常返回调用该运算符的对象重载赋值运算符时,通常返回调用该运算符的对象的引用的引用,我们知道,不能使用引用返回一个局部对象,我们知道,不能使用引用返回一个局部对象,this可以解决这个问题。只要非静态成员函数载运行,可以解决这个问题。只要非静态成员函数载运行,this指针就在作用域内。例指针就在作用域内。例6.4中的重载赋值运算符函数中的重载赋值运算符函数返回一个返回一个Na

50、melist对象的引用,返回表达式是对象的引用,返回表达式是*this,通,通过对过对this的提取操作得到对象本身。例如,赋值语句的提取操作得到对象本身。例如,赋值语句n2=n1;函数返回函数返回n2的引用。这样赋值就能进行连续赋值操作。的引用。这样赋值就能进行连续赋值操作。例如,下面的语句是正确的。例如,下面的语句是正确的。Namelist n1(first object),n2(second object),n3(third object);n3=n2=n1;返回本节返回本节第第4章章 继承机制继承机制6.4.4 赋值运算符重载函数与拷贝构造函数区别赋值运算符重载函数与拷贝构造函数区别(

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(面向对象程序设计教程(C++语言描述)下ppt.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|