面向对象的程序设计chapter.ppt

上传人:sccc 文档编号:5674291 上传时间:2023-08-08 格式:PPT 页数:30 大小:1.28MB
返回 下载 相关 举报
面向对象的程序设计chapter.ppt_第1页
第1页 / 共30页
面向对象的程序设计chapter.ppt_第2页
第2页 / 共30页
面向对象的程序设计chapter.ppt_第3页
第3页 / 共30页
面向对象的程序设计chapter.ppt_第4页
第4页 / 共30页
面向对象的程序设计chapter.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《面向对象的程序设计chapter.ppt》由会员分享,可在线阅读,更多相关《面向对象的程序设计chapter.ppt(30页珍藏版)》请在三一办公上搜索。

1、1,第7章 模板,2,主要内容,参数多态性和模板类模板函数模板,3,7.1 参数多态性和模板,参数多态性问题引入在程序设计中往往存在这样的现象:两个或多个函数(或过程)的函数体完全相同。它们的参数类型和函数返回类型不同。例如:,int max(int x,int y)return(xy)?x:y;float max(float x,float y)return(xy)?x:y;Double max(double x,double y)return(xy)?x:y;,4,7.1 参数多态性和模板,参数多态性能否为上述这些函数只写出一套代码呢?解决这个问题的常规方法是使用宏定义。例如:#defin

2、e max(x,y)(xy)?x:y),5,7.1 参数多态性和模板,参数多态性宏定义带来的问题之一可能在不该替换的地方进行了替换。例如:class exapublic:int max(int,int);/此处宏扩展将导致语法错误/;,6,7.1 参数多态性和模板,参数多态性两种解决方法把类的数据类型定义为一个抽象的、需根据具体问题要求确定的数据类型。把类的数据类型定义为一个参数。即类的参数多态性。方法1举例:例7.1 设计一个适合于float类型和double类型的复数类。,7,7.1 参数多态性和模板,/Complex.h#includeclass Complexprivate:DataT

3、ype real;DataType imag;public:Complex(DataType x=0,DataType y=0):real(x),imag(y)Complex()Complex Add(const Complex x)const;,8,7.1 参数多态性和模板,/#define DataType float#define DataType double#include“Complex.h”void main(void)Complex x(1.1,1.1),y(2.2,2.2);z=x.Add(y);cout“z is:“endl;z.show();,9,7.1 参数多态性和模板

4、,方法1的缺点当一个外部程序中,如果同时存在几种不同的数据类型要求时,则这种通用类不能满足需要。,10,7.1 参数多态性和模板,模板(template)模板概念它可以实现类型参数化,即把函数或类中的数据类型定义为参数,从而解决参数多态性问题,实现代码可重用性。模板分类(按用途)函数模板类模板,11,7.1 参数多态性和模板,模板(template)参数实例化指给函数模板或类模板带入实际的类型参数。C+中把经过参数实例化的函数模板称为模板函数,把经过参数实例化的类模板称为模板类,12,7.1 参数多态性和模板,模板(template)模板、模板函数、模板类和对象之间的关系,13,7.2 类模板

5、,类模板的概念一个类模板(类属类)是一个带参数的类。类模板允许用户为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数或返回值,能取任意数据类型(包括系统预定义的和用户自定义的类型)。,14,7.2 类模板,类模板的设计template class 类名/template是一个声明模板的关键字。模板形参表可包括一个或一个以上的模板参数。每个模板参数前加关键字class。例如:class T1,class T2,,15,7.2 类模板,类模板的设计在类定义中参数化的数据类型用模板形参表示。在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则需在函数体外进行模板声明,并在函数名前的

6、类名后缀上。例如:,16,7.2 类模板,template class Complex T real;T imag;public:Complex(T x=0,T y=0);Complex Add(const Complex x);,17,7.2 类模板,template/模板声明Complex:Complex(T x=0,T y=0)real=x;imag=y;template/模板声明Complex Complex:Add(const Complex x)return Complex(real+x.real,imag+x.imag);,18,7.2 类模板,注意类模板定义前和每个外联函数形式

7、的成员函数模板前,都要加语句:template 原来程序中为Complex的地方,均应改为:Complex,19,7.2 类模板,类模板的使用模板形参实例化在外部程序中,用显式方法给类模板传递实例化参数,生成模板类。类实例化使用模板类定义对象。,20,7.2 类模板,例如:使用复数类模板生成int复数类并创建对象:Complex a(2,4),b(1,5),c;c=a.Add(b);使用复数类模板生成float复数类并创建对象:Complex a(2.1,4.3),b(1.2,5.3),c;c=a.Add(b);,21,7.2 类模板,类模板可有多个模板参数。例如:,templateclass

8、 myclass T1 i;T2 j;public:myclass(T1 a,T2 b)i=a;j=b;/;myclass ob1(12,0.15);myclass ob2(x,“This is a test”);,22,7.3 函数模板,函数模板的定义一般定义格式:template 返回类型 函数名(函数模板形参表)函数体 例:设计一个求两个数中较大数的函数模板。,template T max(T x,T y)return(xy)?x:y;,23,7.3 函数模板,模板函数的生成(函数模板的实例化)基本概念函数模板在具体调用时必须进行参数实例化。经参数实例化而生成的具体函数称为模板函数。对模

9、板形参进行实例化的参数称为模板实参。,24,7.3 函数模板,模板函数的生成(函数模板的实例化)生成模板函数的两种方法显式方法在函数模板调用前,用基本数据类型或用户自定义数据类型对函数模板进行参数实例化,生成模板函数。例如:,25,7.3 函数模板,int myIntX=5,myIntY=8,myIntC;float myFloatX=5.6,myFloatY=8.9,myFloatC;int max(int x,int y);myIntC=max(myIntX,myIntY);float max(float x,float y);myFloatC=max(myFloatX,myFloatY)

10、;,26,7.3 函数模板,模板函数的生成(函数模板的实例化)生成模板函数的两种方法 隐式方法直接传递实参进行函数调用。在函数模板调用时,由编译系统根据调用函数的实际参数的数据类型自动进行参数实例化,生成模板函数。例如:int a=10,b=20,c;c=max(a,b);,27,7.3 函数模板,函数模板与同名的非模板函数的的调用规则对一个实际的函数调用,首先寻找一个参数完全匹配的函数,若找到就调用它。在1)失败后,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,若找到就调用它。在1)和2)均失败后,再试一试低一级的对函数的重载方法,例如通过类型转换可产生参数匹配等,若找到就调用它。若

11、1),2),3)均失败,则这是一个错误的调用。,28,template T max(T x,T y)couty)?X:y;,int max(int x,int y)couty)?X:y;,char max(int x,char y)couty)?x:y;,void main(void)int i=10;char c=a;float f=43.74;max(i,i);/B max(c,c);/A max(i,c);/C max(c,i);/B max(f,f);/A max(f,i);/B,A,B,C,29,本章小结,主要内容重点参数多态性的概念类模板的设计与使用函数模板的设计与使用难点参数多态性的概念类模板的设计与使用函数模板的设计与使用,30,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号