第20讲模板 教学目的与要求: 了解模板的功能和作用。 掌握函数模板和类模板的声明和使用。 教学内容提要 函数模板; 2、函数模板参数; 3、类模板; 教学重点:函数模板和类模板的声明和使用 教学难点:函数模板的申明和使用。 教学进度:P222~P238 教学过程:
第 20 讲 模板 •教学目的与要求: 了解模板的功能和作用。 掌握函数模板和类模板的声明和使用。 •教学内容提要: 1、函数模板; 2、函数模板参数; 3、类模板; •教学重点: 函数模板和类模板的声明和使用。 •教学难点: 函数模板的申明和使用。 •教学进度:P222~P238 •教学过程:
所谓模板是一种使用无类型参数来产生一系列函数或类的机制,是C的 个重要特性。它的实现,方便了更大规模的软件开发 模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每 个对象的类型。通过模板可以产生类或函数的集合,使它们操作不同的数据 类型,从而避免需要为每一种数据类型产生一个单独的类或函数。 例如:设计一个求两参数最大值的函数,不使用模板时,需 要定义四个函数 int max (int a, int breturn(a>b)?a, b; 1 long max (long a, long breturn(a>b)?a, b j double max(double a, double breturn(a>b)? a, b 3 char max(char a, char breturn(a>b)?a, b; 5 若使用模板,则只定义一个函数: Template<class type type max(type a, type b) return(a>b)a, b; 1
所谓模板是一种使用无类型参数来产生一系列函数或类的机制,是C++的一 个重要特性。它的实现,方便了更大规模的软件开发。 ◼模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每 个对象的类型。通过模板可以产生类或函数的集合,使它们操作不同的数据 类型,从而避免需要为每一种数据类型产生一个单独的类或函数。 例如:设计一个求两参数最大值的函数,不使用模板时,需 要定义四个函数: int max(int a,int b){return(a>b)?a,b;} long max(long a,long b){return(a>b)?a,b;} double max(double a,double b){return(a>b)?a,b;} char max(char a,char b){return(a>b)?a,b;} 若使用模板,则只定义一个函数: Template<class type> type max(type a,type b) {return(a>b)?a,b;}
C艹+程序由类和函数组成,模板也分为类模板( class template) 和函数模板( function template)。 191函数模板 利用函数模板,可以建立一个具有通用功能的函数,支持不 同的函数参数和返回值,达到减少代码书写量的目的。 1、函数模板的一般说明形式如下: template<模板形参表> <返回值类型><函数名>(模板函数形参表) //函数定义体 其中,<模板形参表>可以包含基本数据类型,也可以包含类类 型。类型形参需要加前缀 class。如果类型形参多于一个,则 每个类型形参都要使用 class<模板函数形参表>中的参数必 须是惟一的,而且在<函数定义体>中至少出现一次
利用函数模板,可以建立一个具有通用功能的函数,支持不 同的函数参数和返回值,达到减少代码书写量的目的。 【 19.1 函数模板】 C++程序由类和函数组成,模板也分为类模板(class template) 和函数模板(function template)。 1、函数模板的一般说明形式如下: template <模板形参表> <返回值类型> <函数名>(模板函数形参表) { //函数定义体 } 其中,<模板形参表>可以包含基本数据类型,也可以包含类类 型。类型形参需要加前缀class。如果类型形参多于一个,则 每个类型形参都要使用class。<模板函数形参表>中的参数必 须是惟一的,而且在<函数定义体>中至少出现一次
2、使用函数模板 函数模板只是说明,不能直接执行,需要实例化 为模板函数后才能执行。 当编译系统发现有一个函数调用 <函数名>(<实参表>) 时,将根据<实参表>中的类型生成一个重载函数 即模板函数。该模板函数的定义体与函数模板 的函数定义体相同,而<形参表>的类型则以< 实参表>的实际类型为依据
函数模板只是说明,不能直接执行,需要实例化 为模板函数后才能执行。 当编译系统发现有一个函数调用: <函数名>(<实参表>); 时,将根据<实参表>中的类型生成一个重载函数 即模板函数。该模板函数的定义体与函数模板 的函数定义体相同,而<形参表>的类型则以< 实参表>的实际类型为依据。 2 、 使用函数模板
例如重载函数,求绝对值的函数只要声明一个函数模板: template <class T Tabs(t value) return value>0? value-value 在主程序中可以这样使用函数模板: void maino int n value=-1n Result 第一次使用函数模板abs()时 double dblvalue=1.2, diRest参为整数,由此可以推导出函数 rEsult=abs(n value 模板中的参数类型为整数,函 dblresult= abs(dblvalue;的返回(是b)时实参 cout< <n val<"m<< Results<end为双精度型,由此推导 cout< dblvalue<</"< cdblresult<<数模板中的参数类 返回值为双精度型。 121.2
template <class T> T abs(T value) { return value>0? value: -value; } 例如重载函数,求绝对值的函数只要声明一个函数模板: void main() { int nValue=-1,nResult; double dblValue=-1.2,dblResult; nResult=abs(nValue); dblResult=abs(dblValue); cout<<nValue<<″ ″<<nResult<<endl; cout<<dblValue<<″ ″<<dblResult<<endl; } -1 1 -1.2 1.2 第一次使用函数模板abs()时, 实参为整数,由此可以推导出函数 模板中的参数类型T为整数,函数 的返回值也是整数。 第二次调用abs()时实参 为双精度型,由此推导 出函数模板中的参数类 型T为双精度型,函数的 返回值为双精度型。 在主程序中可以这样使用函数模板: