第2章 面向对象程序设计基础

上传人:痛*** 文档编号:152624811 上传时间:2022-09-16 格式:PPT 页数:67 大小:351.50KB
收藏 版权申诉 举报 下载
第2章 面向对象程序设计基础_第1页
第1页 / 共67页
第2章 面向对象程序设计基础_第2页
第2页 / 共67页
第2章 面向对象程序设计基础_第3页
第3页 / 共67页
资源描述:

《第2章 面向对象程序设计基础》由会员分享,可在线阅读,更多相关《第2章 面向对象程序设计基础(67页珍藏版)》请在装配图网上搜索。

1、1Visual C+Visual C+实用教程实用教程2教学目标:v了解面向对象的基本概念了解面向对象的基本概念v 熟练掌握类、对象、派生类的定义和使用熟练掌握类、对象、派生类的定义和使用v 掌握类的构造函数和析构函数的定义和特点掌握类的构造函数和析构函数的定义和特点v 能够利用虚函数实现多态性能够利用虚函数实现多态性v熟悉友元的特性熟悉友元的特性 3教学内容:2.1 面向对象的基本概念面向对象的基本概念2.2 类和对象的定义类和对象的定义2.3 继承性和派生类继承性和派生类 2.4 多态性多态性2.5 友元友元2.6 模板模板42.1 面向对象的基本概念v观点:观点:自然界是由实体(对象)所

2、组成。v程序设计方法:程序设计方法:使用面向对象的观点来描述、模仿并处理现实问题。v要求:要求:高度概括、分类、和抽象。v目的:目的:实现软件设计的产业化。程序程序=多个对象多个对象+消息消息5类和对象v对象是现实世界中一个实际存在的事物对象是现实世界中一个实际存在的事物对象的静态特征对象的静态特征对象的行为对象的行为v类是具有相同属性和行为的一组对象的集合,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。其内部包括属性和行为两个主要部分。v对象之间的交互:发送消息对象之间的交互:

3、发送消息6封装v封装的目的是隐藏对象的内部的实现细节。封装的目的是隐藏对象的内部的实现细节。v通过封装,可以将对象的外部接口与内部的通过封装,可以将对象的外部接口与内部的实现细节分开。实现细节分开。v目的是目的是增强安全性增强安全性和和简化编程简化编程,使用者不必,使用者不必了解具体的实现细节,而只需要通过外部接口,了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。以特定的访问权限,来使用类的成员。7继承v继承是继承是C+中支持层次分类的一种机中支持层次分类的一种机制,允许程序员在保持原有类特性的基制,允许程序员在保持原有类特性的基础上,对新类进行更具体的说明。础上,

4、对新类进行更具体的说明。v实现:声明派生类实现:声明派生类2.38多态性v多态:同一名称,不同的功能实现方式。多态:同一名称,不同的功能实现方式。v目的:目的:标识统一,减少程序中标识符的个数;标识统一,减少程序中标识符的个数;接口统一,增加程序的灵活性接口统一,增加程序的灵活性v实现:实现:2.4编译时的多态性:重载函数编译时的多态性:重载函数运行时的多态性:虚函数运行时的多态性:虚函数9v类是类是C+的灵魂,如果不真正掌握类,就不能真的灵魂,如果不真正掌握类,就不能真正掌握正掌握C+vC+中的类就是一种用户自己定义的数据类型,中的类就是一种用户自己定义的数据类型,和其它数据类型不同的是,组

5、成这种类型的不仅和其它数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数。可以有数据,而且可以有对数据进行操作的函数。v为了封装的需要,一般将类的定义放在一个为了封装的需要,一般将类的定义放在一个.h文文件中,而将类的成员函数的实现放在一个件中,而将类的成员函数的实现放在一个.cpp文文件中。件中。102.2.1 类的定义class 类名称类名称 public:公有成员(外部接口)公有成员(外部接口)private:私有成员私有成员 protected:保护成员保护成员;类与外部的接口类与外部的接口只允许本类中的只允许本类中的函数访问函数访问(可省略)可省略)只能由

6、本类及其派生类只能由本类及其派生类的成员函数访问的成员函数访问是必需的是必需的成员访问成员访问说明符说明符11例2.1:圆类的定义v见教材见教材24页页12v类的数据成员(成员变量)类的数据成员(成员变量):与一般的变量声明相:与一般的变量声明相同,但需要将它放在类的声明体中,一般为同,但需要将它放在类的声明体中,一般为私有访问私有访问属属性。性。v类的成员函数定义类的成员函数定义:在类中说明原型,类外给出函数体实现,函数名之前在类中说明原型,类外给出函数体实现,函数名之前必须加类名和作用域区分符限定必须加类名和作用域区分符限定将成员函数定义为内联函数:将成员函数定义为内联函数:v成员函数在类

7、的内部定义,此时无须使用成员函数在类的内部定义,此时无须使用inlineinline关关键字,成员函数自动为内联函数。键字,成员函数自动为内联函数。v成员函数在类内声明,在类外定义。但在类外定义成员函数在类内声明,在类外定义。但在类外定义时,要加关键字时,要加关键字inline。类的成员函数允许声明为类的成员函数允许声明为说明:13const成员函数vconst成员函数:成员函数:不修改数据成员的值,不修改数据成员的值,在程序中如果不小心修改了这个成员函数中的对象,在程序中如果不小心修改了这个成员函数中的对象,则编译器会产生一个语法错误信息。则编译器会产生一个语法错误信息。vconst con

8、st 成员函数的定义方法:成员函数的定义方法:在函数的原型和定义中,在函数参数表和函数定义在函数的原型和定义中,在函数参数表和函数定义的左花括号之间加入的左花括号之间加入constconst关键字。关键字。v类的成员函数允许重载,允许带缺省参数值。类的成员函数允许重载,允许带缺省参数值。14性质:性质:v与类同名、无返回类型与类同名、无返回类型v在对象创建时在对象创建时由系统自动调用由系统自动调用v允许允许重载重载、带缺省值带缺省值v如果类中未声明,则系统自动生成一个如果类中未声明,则系统自动生成一个缺省缺省形式形式的构造函数,形如:类名()的构造函数,形如:类名()作用:对象的初始化15构造

9、函数举例-CCircle类class CCircle public:CCircle()/无参(缺省)构造函数无参(缺省)构造函数 radius=1;CCircle(double r)/带参构造函数带参构造函数 private:double radius;CCircle:CCircle(double r)radius=r0?r:1;两个构造函数合成一个带缺省值的构造函数两个构造函数合成一个带缺省值的构造函数CCircle(double r=1);/构造函数原型构造函数原型CCircle:CCircle(double r)/构造函数定义构造函数定义 radius=r0?r:1;16拷贝构造函数拷贝

10、构造函数是一种特殊的构造函数,其形参为本类对象拷贝构造函数是一种特殊的构造函数,其形参为本类对象的引用。的引用。class 类名类名public:类名(形参);类名(形参);/构造函数构造函数 类名(类名(类名类名&对象名对象名););/拷贝构造函数拷贝构造函数 ;类名类名:类名(类名类名(类名&对象名)对象名)/拷贝构造函数的实现拷贝构造函数的实现 函数函数体体 17拷贝构造函数举例class CCircle public:CCircle(float m=1,float n=1,float r=1);CCircle(const CCircle&c)/拷贝构造函数 radius=c.radiu

11、s;18v当用类的一个对象去初始化该类的另一个对象时当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现对象的拷贝赋值。系统自动调用它实现对象的拷贝赋值。void main()CCircle c1;CCircle c2(c1);/拷贝构造函数被调用拷贝构造函数被调用拷贝构造函数调用之一19拷贝构造函数调用之二v若函数的形参为类对象按值传递时,实参赋值若函数的形参为类对象按值传递时,实参赋值给形参,将自动调用复制构造函数,给形参,将自动调用复制构造函数,例如:例如:void fun1(CCircle c)coutc.GetRadius()endl;void main()CCircle c

12、1(2,2,10);fun1(c1);/调用复制构造函数调用复制构造函数 20v当函数的返回值是类对象时,系统自动调用复当函数的返回值是类对象时,系统自动调用复制构造函数制构造函数。例如:。例如:CCircle fun2()CCircle c2(10);return c2;/调用复制构造函数调用复制构造函数void main()CCircle c3;c3=fun2();拷贝构造函数调用之三21拷贝构造函数说明22v作用:是释放对象所占的动态内存空间。作用:是释放对象所占的动态内存空间。v特点:特点:函数名:函数名:类名();类名();没有参数,也不返回任何值没有参数,也不返回任何值不允许不允许

13、重载重载如果类中未定义析构函数,编译器将自动生如果类中未定义析构函数,编译器将自动生成一个缺省的析构函数。形如成一个缺省的析构函数。形如:类名类名()23v对象定义在一个函数体中,该函数调用结对象定义在一个函数体中,该函数调用结束后,自动调用析构函数;束后,自动调用析构函数;v用用newnew生成的动态对象,当使用生成的动态对象,当使用deletedelete删除删除时,自动调用析构函数。时,自动调用析构函数。242.2.4 对象的定义和使用v类的对象是该类的某一特定实体,即类类型的变量。类的对象是该类的某一特定实体,即类类型的变量。v声明形式:声明形式:类名类名 对象名;对象名;v例:例:C

14、Circle C1;CCircle *pCircle;CCircle ArrayCircle 3;25类成员的访问方式v类内成员互访类内成员互访直接使用成员名直接使用成员名可以访问任意属性成员可以访问任意属性成员v类外访问类外访问只能访问只能访问 属性的成员属性的成员使用使用“”方式方式使用使用“”方式方式26this指针v在在C+中为每个非静态成员函数提供了一个名字中为每个非静态成员函数提供了一个名字为为this的指针,当进行成员函数调用时,系统自的指针,当进行成员函数调用时,系统自动将调用此成员函数的对象的地址作为一个隐含动将调用此成员函数的对象的地址作为一个隐含的参数传递给的参数传递给t

15、his指针,即让指针,即让this指针指向调用此指针指向调用此成员函数的对象,从而使成员函数知道该对哪个成员函数的对象,从而使成员函数知道该对哪个对象进行操作。对象进行操作。v使用使用this指针,保证了每个对象可以拥有不同的指针,保证了每个对象可以拥有不同的数据成员,但处理这些数据成员的代码可以被所数据成员,但处理这些数据成员的代码可以被所有的对象共享。有的对象共享。27例2.2 类的应用举例(教材28页)一圆型游泳池如图所示,现需要在其周围一圆型游泳池如图所示,现需要在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格建一圆型过道,并在其四周围上栅栏。栅栏价格为为35元元/米,过道造价为米,

16、过道造价为20元元/平方米。过道宽度平方米。过道宽度为为3米,游泳池半径由键盘输入。要求编程计算米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。并输出过道和栅栏的造价。游泳池过道282.2.5 静态类成员291、静态数据成员30静态数据成员的定义和初始化class CCirclepublic:private:static int NumOfObject;/程序中生成的对象的个数程序中生成的对象的个数;int CCircle:NumOfObject=0;/静态数据成员的初始化静态数据成员的初始化31因此当其访问非静态因此当其访问非静态 数据成员时,必须通过对象名或对象指针访问数据成

17、员时,必须通过对象名或对象指针访问2、静态成员函数32使用静态类成员(教材使用静态类成员(教材3030页)页)3、静态成员的访问类名类名:成员名成员名(常用常用)对象名对象名.成员名成员名332.3 继承性和派生类v继承的实质:继承的实质:是从已有的类建立新类是从已有的类建立新类。v通过继承,派生类自动拥有基类的所有成员(数通过继承,派生类自动拥有基类的所有成员(数据成员和成员函数)据成员和成员函数)342.3.1 派生类的定义class 派生类名:派生类名:继承方式继承方式 基类名基类名 成员声明;成员声明;35继承方式三种继承方式:三种继承方式:public(公有)、(公有)、privat

18、e(私有)、(私有)、protected(保护),(保护),表表2-1 2-1 继承方式对派生类的影响继承方式对派生类的影响继承方式继承方式说说 明明publicpublic(公有)(公有)基类的基类的publicpublic和和protectedprotected成员被派生类继承后,保持原来的访问属性成员被派生类继承后,保持原来的访问属性不变不变privateprivate(私有)(私有)基类的基类的publicpublic和和protectedprotected成员被派生类继承后,变成派生类的成员被派生类继承后,变成派生类的privateprivate成员成员protectedprotec

19、ted(保(保护)护)基类的基类的publicpublic和和protectedprotected成员被派生类继承后,变成派生类的成员被派生类继承后,变成派生类的protectedprotected成员成员36例2.3 类的派生示例v教材教材3131页页 372.3.2 派生类的构造函数与析构函数v基类的构造函数不能被继承,需要在派生基类的构造函数不能被继承,需要在派生类中负责基类成员的初始化类中负责基类成员的初始化。v通过在通过在成员初始化表成员初始化表中显式调用基类的构中显式调用基类的构造函数来实现的造函数来实现的v单一继承时的构造函数单一继承时的构造函数派生类名派生类名:派生类名派生类名

20、(基类成员和本类成员所基类成员和本类成员所 需的形参需的形参):基类名基类名(实参实参)本类成员初始化;本类成员初始化;38派生类构造函数与析构函数的执行顺序v在创建派生类的对象时,派生类的构造函数总在创建派生类的对象时,派生类的构造函数总是先调用其基类的构造函数来完成基类成员的是先调用其基类的构造函数来完成基类成员的初始化。初始化。v如果在基类和派生类中都包含其他类的对象如果在基类和派生类中都包含其他类的对象(即有对象成员),则在创建派生类的对象时,(即有对象成员),则在创建派生类的对象时,首先执行基类的对象成员的构造函数,接着执首先执行基类的对象成员的构造函数,接着执行基类的构造函数,然后

21、执行派生类的对象成行基类的构造函数,然后执行派生类的对象成员的构造函数,最后才执行派生类的构造函数。员的构造函数,最后才执行派生类的构造函数。v当派生类对象的生命周期结束时,析构函数的当派生类对象的生命周期结束时,析构函数的执行顺序和构造函数的执行顺序正好相反。执行顺序和构造函数的执行顺序正好相反。392.3.3 多继承v如果一个派生类有多个直接基类,则称如果一个派生类有多个直接基类,则称为多继承。为多继承。v多继承意味着一个派生类可以继承多个多继承意味着一个派生类可以继承多个基类的成员,这种强大的功能支持了软基类的成员,这种强大的功能支持了软件的重用性,但可能会引起大量的二义件的重用性,但可

22、能会引起大量的二义性(歧义性)问题。性(歧义性)问题。401.多继承的定义格式class class :,;v其中,继承方式的使用与单继承完全相同。其中,继承方式的使用与单继承完全相同。v【例【例2.42.4】使用多继承】使用多继承 (教材(教材3535页)页)412.多继承派生类对象的初始化 v多继承派生类对象的初始化与单继承类多继承派生类对象的初始化与单继承类似,利用成员初始化值语法显式调用所似,利用成员初始化值语法显式调用所有直接基类的构造函数对派生类中的基有直接基类的构造函数对派生类中的基类成员进行初始化,这些构造函数之间类成员进行初始化,这些构造函数之间用逗号隔开。用逗号隔开。423

23、.二义性问题1.1.因不同基类中可能含有同名成员引起的二义性:因不同基类中可能含有同名成员引起的二义性:用基类名加以限定,形如:基类名:同名成用基类名加以限定,形如:基类名:同名成员名,以明确指出所使用的成员是从哪个基类员名,以明确指出所使用的成员是从哪个基类继承来的。继承来的。2.2.因公共基类使得派生类中含有同名成员,因此因公共基类使得派生类中含有同名成员,因此也会产生二义性。为了消除这种二义性,也必也会产生二义性。为了消除这种二义性,也必须使用基类名限定所访问的同名成员。须使用基类名限定所访问的同名成员。434.虚基类v解决多继承中因公共基类而产生的二义性问题。解决多继承中因公共基类而产

24、生的二义性问题。v声明虚基类的一般格式为:声明虚基类的一般格式为:class class :virtual :virtual ;v保留字保留字virtualvirtual和继承方式的相对位置无关紧和继承方式的相对位置无关紧要,但要放在基类名之前,并且要,但要放在基类名之前,并且virtualvirtual只对只对紧跟其后的基类名起作用。紧跟其后的基类名起作用。v【例【例2.52.5】使用虚基类(教材】使用虚基类(教材3636页)。页)。44使用虚基类时应注意的问题:1.从虚基类派生出的所有派生类(直接派生类和间从虚基类派生出的所有派生类(直接派生类和间接派生类),都要调用虚基类的构造函数,以初

25、接派生类),都要调用虚基类的构造函数,以初始化虚基类中的数据成员。始化虚基类中的数据成员。2.基类构造函数的调用顺序是,先调用虚基类的构基类构造函数的调用顺序是,先调用虚基类的构造函数,然后再调用非虚基类的构造函数,与成造函数,然后再调用非虚基类的构造函数,与成员初始化值列表中的顺序无关。员初始化值列表中的顺序无关。3.虚基类的构造函数只调用一次。虚基类的数据成虚基类的构造函数只调用一次。虚基类的数据成员由最新派生出来的派生类负责初始化,并且只员由最新派生出来的派生类负责初始化,并且只被初始化一次。被初始化一次。452.4 多态性v在面向对象的程序设计中,把不同类的在面向对象的程序设计中,把不

26、同类的对象收到相同的消息时产生多种不同的对象收到相同的消息时产生多种不同的行为方式称为多态性。行为方式称为多态性。462.4.1 两种多态性 v联编:将一个函数调用链接上相应于函数体的代码,这一联编:将一个函数调用链接上相应于函数体的代码,这一过程称为函数联编(简称联编)。过程称为函数联编(简称联编)。v静态联编:静态联编:在编译阶段完成;优点是执行速度快在编译阶段完成;优点是执行速度快v动态联编:动态联编:在运行时才能把函数调用与函数体联系在一起。在运行时才能把函数调用与函数体联系在一起。具有灵活性高,易于扩充和维护等优点,但运行效率较低。具有灵活性高,易于扩充和维护等优点,但运行效率较低。

27、v静态联编所支持的多态性称为编译时的多态性,通过函数静态联编所支持的多态性称为编译时的多态性,通过函数重载来实现。重载来实现。v动态联编所支持的多态性称为运行时的多态性,通过虚函动态联编所支持的多态性称为运行时的多态性,通过虚函数来实现。数来实现。472.4.2 编译时的多态性v【例【例2.6】编译时的多态性】编译时的多态性(教材(教材39页)页)482.4.3 虚函数v虚函数是实现动态联编的基础。虚函数是实现动态联编的基础。v虚函数的声明:在函数原型之前加虚函数的声明:在函数原型之前加virtual。class public:/虚函数的声明虚函数的声明 virtual (););/虚函数的定

28、义虚函数的定义 :().49应注意的问题:v应该在类层次结构中需要多态性的最高层应该在类层次结构中需要多态性的最高层类内声明虚函数。类内声明虚函数。v派生类中与基类虚函数原型完全相同的成派生类中与基类虚函数原型完全相同的成员函数,会自动成为虚函数。员函数,会自动成为虚函数。v不能把静态成员函数、构造函数和全局函不能把静态成员函数、构造函数和全局函数声明为虚函数。数声明为虚函数。v析构函数可以声明为虚函数。析构函数可以声明为虚函数。v通过声明虚函数来使用通过声明虚函数来使用C+C+提供的多态性提供的多态性机制时,派生类应该从它的基类公有派生。机制时,派生类应该从它的基类公有派生。502.使用虚函

29、数v必须合理调用虚函数才能实现动态联编。必须合理调用虚函数才能实现动态联编。v只有使用基类类型的指针或引用调用虚函数时,只有使用基类类型的指针或引用调用虚函数时,系统才以动态联编方式实现对虚函数的调用,才系统才以动态联编方式实现对虚函数的调用,才能获得运行时的多态性。能获得运行时的多态性。v通常都用指向第一次定义虚函数的基类对象的指通常都用指向第一次定义虚函数的基类对象的指针或引用来调用虚函数针或引用来调用虚函数。v虚函数的使用(教材虚函数的使用(教材4141页)页)513.纯虚函数v纯虚函数:在声明时纯虚函数:在声明时“初始化值初始化值”为为0的函数。的函数。class class publ

30、icpublic:virtual virtual ()=0=0;v纯虚函数不需要进行定义纯虚函数不需要进行定义52抽象类v带有纯虚函数的类称为抽象类。带有纯虚函数的类称为抽象类。v不能声明抽象类的对象,但可以声明抽象类的指不能声明抽象类的对象,但可以声明抽象类的指针就引用。针就引用。v抽象类只能作为抽象类只能作为基类基类来使用。来使用。v一个类可以从基类一个类可以从基类继承接口继承接口和(或)和(或)继承实现继承实现v【例【例2.72.7】虚函数和纯虚函数的使用】虚函数和纯虚函数的使用(教材(教材4343页)页)532.5 友元542.5.1 友元函数v能够访问一个类的私有部分而又不是该类成员

31、能够访问一个类的私有部分而又不是该类成员函数的函数,称为该类的友元函数。函数的函数,称为该类的友元函数。v将一个函数声明为类的友元,就是在类定义中将一个函数声明为类的友元,就是在类定义中该函数的原型前面加上关键字该函数的原型前面加上关键字friendfriend。如下所。如下所示:示:class A friend void setX(A&,int);55友元函数说明v友元函数虽然在类内声明,但它不是该类的成员友元函数虽然在类内声明,但它不是该类的成员函数,所以友元函数没有函数,所以友元函数没有thisthis指针。指针。v友元关系的声明与成员访问说明符友元关系的声明与成员访问说明符privat

32、eprivate、protectedprotected和和publicpublic无关,因此友元函数声明可无关,因此友元函数声明可以放在类定义中的任何地方。以放在类定义中的任何地方。v【例【例2.82.8】使用友元函数计算两点间的距离。】使用友元函数计算两点间的距离。56友元成员v一个类的成员函数也可以声明为另一个类的友元函数。一个类的成员函数也可以声明为另一个类的友元函数。v把类把类C1C1的成员函数的成员函数funcfunc声明为类声明为类C2C2的友元函数:的友元函数:class C1 void func(););class C2 friend void C1:func(););/声明友

33、元成员声明友元成员 ;void C1:func()/定义友元成员定义友元成员 572.5.2 友元类v如果一个类的所有成员函数都可以访问另一如果一个类的所有成员函数都可以访问另一个类的私有成员,则可以把这个类声明为另个类的私有成员,则可以把这个类声明为另一个类的友元类。一个类的友元类。v例如,把类例如,把类C1C1声明为类声明为类C2C2的友元类:的友元类:class C2 friend class C1;v【例【例2.92.9】使用友元类(教材】使用友元类(教材4747页)页)58v模板是模板是C+C+实现软件重用的一种形式,是实现软件重用的一种形式,是C+C+最强大的特性最强大的特性之一。

34、之一。v利用模板,我们可以用一段代码指定一组相关函数(称为利用模板,我们可以用一段代码指定一组相关函数(称为模板函数)或一组相关类(称为模板类)。这样能大幅度模板函数)或一组相关类(称为模板类)。这样能大幅度地节约程序代码,显著减少冗余信息,从而进一步提高面地节约程序代码,显著减少冗余信息,从而进一步提高面向对象程序的可重用性和可维护性。向对象程序的可重用性和可维护性。v模板的功能很强,用户既可以定义类模板,也可以定义函模板的功能很强,用户既可以定义类模板,也可以定义函数模板,还可以使用数模板,还可以使用C+C+标准模板库(标准模板库(STLSTL)中已有的模板。)中已有的模板。592.6.1

35、 函数模板v如果几个函数的功能相同,实现算法也相同,如果几个函数的功能相同,实现算法也相同,只是所处理的数据的类型不同,使用函数模板只是所处理的数据的类型不同,使用函数模板更简洁,更方便。更简洁,更方便。v1 1函数模板的定义函数模板的定义 template class template class 函数模板定义体函数模板定义体60说明vtemplatetemplate是是C+C+的保留字,表示后面定义的是一的保留字,表示后面定义的是一个模板。个模板。v 形如形如 ,T1T1,T2T2等是类型参数(形式参数),等是类型参数(形式参数),v函数模板定义体与普通函数的定义相同,只不过函数模板定义体

36、与普通函数的定义相同,只不过其中的有些数据类型,例如返回值类型,形参的其中的有些数据类型,例如返回值类型,形参的类型,局部变量的类型等,要使用类型参数表中类型,局部变量的类型等,要使用类型参数表中的标识符的标识符T1T1,T2T2等表示。等表示。612.函数模板的调用v函数模板的调用格式有两种函数模板的调用格式有两种:第一种格式:函数模板名(实参表)第一种格式:函数模板名(实参表)第二种格式:函数模板名第二种格式:函数模板名 (实参表)(实参表)v函数模板的调用过程函数模板的调用过程:函数模板实例化,把模板的类型参数函数模板实例化,把模板的类型参数T1T1,T2T2等用具等用具体的数据类型去替

37、换。函数模板实例化后会得到一体的数据类型去替换。函数模板实例化后会得到一个具体的函数,该函数称为模板函数。个具体的函数,该函数称为模板函数。执行模板函数,完成所需要的功能。执行模板函数,完成所需要的功能。v【例【例2.102.10】利用函数模板实现求两个数据的较】利用函数模板实现求两个数据的较大值。(教材大值。(教材5050页)页)623.函数模板的特点v函数模板实际上代表了一组函数,而不是一个函数模板实际上代表了一组函数,而不是一个具体函数。所以,函数模板必须先实例化,才具体函数。所以,函数模板必须先实例化,才能完成具体函数的功能。能完成具体函数的功能。v函数模板不具有隐式类型转换的能力。函

38、数模板不具有隐式类型转换的能力。普通函数在进行调用时,如果实参的类型与形参的普通函数在进行调用时,如果实参的类型与形参的类型不同,则系统会自动对参数类型进行隐式转换,类型不同,则系统会自动对参数类型进行隐式转换,将实参的值转换为函数所需的类型(实际上是生成将实参的值转换为函数所需的类型(实际上是生成一个临时值使用),然后再进行函数调用。而函数一个临时值使用),然后再进行函数调用。而函数模板不具有这种功能。模板不具有这种功能。634.重载函数模板v函数模板本身可以用多种方式重载,函数模板本身可以用多种方式重载,用一个函数模板重载另一个函数模板,只要用一个函数模板重载另一个函数模板,只要这两个模板

39、的名字相同,但参数不同。这两个模板的名字相同,但参数不同。用普通函数去重载一个同名的函数模板。用普通函数去重载一个同名的函数模板。v示例:重载函数模板(教材示例:重载函数模板(教材5151页)页)642.6.2 类模板1.定义类模板定义类模板(1 1)定义类)定义类template class class ;(2 2)定义成员函数)定义成员函数65v类模板与函数模板一样,也是代表一组类。因此类模板与函数模板一样,也是代表一组类。因此在使用类模板时首先要把它实例化为一个具体的在使用类模板时首先要把它实例化为一个具体的类,这个具体的类称为模板类。把类模板实例化类,这个具体的类称为模板类。把类模板实例化为模板类的格式如下:为模板类的格式如下:类名类名 v然后用模板类声明对象并使用这些对象完成所需然后用模板类声明对象并使用这些对象完成所需要的功能。要的功能。v【例【例2.112.11】使用类模板。(教材】使用类模板。(教材5252页)页)66v(1 1)从类模板派生出类模板)从类模板派生出类模板 template class CBase ;template class CDerived:public CBase ;v(2 2)从类模板派生出普通类)从类模板派生出普通类template class CBase ;class CDerived:public CBase ;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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