第十章模板 模板( Template)是C++支持参数化多态的工具,使用 模板可以减少程序员的重复劳动,使程序员可以建立具有通用 类型的函数库和类库 所谓模板是一种使用无类型参数来产生一系列函数或类的 机制,是C++的一个重要特性。它的实现,方便了更大规模的 软件开发。 若一个程序的功能是对某种特定的数据类型进行处理,则 可以将所处理的数据类型说明为参数,以便在其他数据类型的 情况下使用,这就是模板的由来。模板是以一种完全通用的方 法来设计函数或类而不必预先说明将被使用的每个对象的类型。 通过模板可以产生类或函数的集合,使它们操作不同的数据类 型,从而避免需要为每一种数据类型产生一个单独的类或函数
第十章 模板 模板(Template)是C++支持参数化多态的工具,使用 模板可以减少程序员的重复劳动,使程序员可以建立具有通用 类型的函数库和类库。 所谓模板是一种使用无类型参数来产生一系列函数或类的 机制,是C++的一个重要特性。它的实现,方便了更大规模的 软件开发。 若一个程序的功能是对某种特定的数据类型进行处理,则 可以将所处理的数据类型说明为参数,以便在其他数据类型的 情况下使用,这就是模板的由来。模板是以一种完全通用的方 法来设计函数或类而不必预先说明将被使用的每个对象的类型。 通过模板可以产生类或函数的集合,使它们操作不同的数据类 型,从而避免需要为每一种数据类型产生一个单独的类或函数
10.1模板攏魯 为什么要引进模板概念: 例如,设计一个求两参数最大值的函数,不使用模板时,需要定 义四个函数: int max int a, int btreturn(a>b?a, b;3 long max(long a, long btreturn (a>ba, biy double max double a, double bireturn(a>ba, b;y char max(char a, char btreturn(a>b?a, b;y 我们从上可以看到,这四个函数的功能都是一样的,只不过 函数的参数类型和返回类型不一样,显然这样设计就显的程序代 码很冗余,那怎么解决该问题呢: 采用宏定义:# define maxi(xy)(x>y)?(x):(y) 在C++中,宏替换不进行任何类型检查,则显然不符合 C++的强类型语言,即数据类型必须强制说明和检查。不鼓励 使用宏定义,解决这问题可以用C++的模板函数解决
10.1 模板概念 为什么要引进模板概念: 例如,设计一个求两参数最大值的函数,不使用模板时,需要定 义四个函数: 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; } 我们从上可以看到,这四个函数的功能都是一样的,只不过 函数的参数类型和返回类型不一样,显然这样设计就显的程序代 码很冗余,那怎么解决该问题呢: 采用宏定义:#define max(x, y) ((x>y)?(x):(y)) 在C++中,宏替换不进行任何类型检查,则显然不符合 C++的强类型语言,即数据类型必须强制说明和检查。不鼓励 使用宏定义,解决这问题可以用C++的模板函数解决
10.1模板攏魯 若使用模板函数,则只需定义一个函数模板: template <class type> type max type a, type b) d return(a>ba, b;y c++程序由类和函数组成,模板也分为类模板(cass emplate)和函数模板( function template)。在说明了 个函数模板后,当编译系统发现有一个对应的函数调用时, 将根据实参中的类型来确认是否匹配函数模板中对应的形参, 然后生成一个重载函数。该重载函数的定义体与函数模板的函 数定义体相同,它称之为模板函数( template function)。 同样,在说明了一个类模板之后,可以创建类模板的实 例,即生成模板类
10.1 模板概念 C++程序由类和函数组成,模板也分为类模板(class template)和函数模板(function template)。在说明了 一个函数模板后,当编译系统发现有一个对应的函数调用时, 将根据实参中的类型来确认是否匹配函数模板中对应的形参, 然后生成一个重载函数。该重载函数的定义体与函数模板的函 数定义体相同,它称之为模板函数(template function)。 同样,在说明了一个类模板之后,可以创建类模板的实 例,即生成模板类。 若使用模板函数,则只需定义一个函数模板: template <class type> type max(type a, type b) { return(a>b)?a,b; }
10.2搬模板 C++提供的函数模板可以定义一个对任何类型变量进行操 作的函数,从而大大增强了函数设计的通用性。使用函数模板 的方法是先说明函数模板,然后实例化成相应的模板函数进行 调用执行 函数模板说明: 函数模板的一般说明形式如下: template< class模板参数表> <返回值类型><函数名>(模板函数形参表) //函数定义体; 其中, template是定义模板的关键字,<模板参数表>可 以包含基本数据类型,也可以包含类类型,如果类型形参多于 个,则每个类型参数都要使用 class,并且它们之间用逗号隔 开。<模板函数形参表>中的参数必须是惟一的
10.2 函数模板 C++提供的函数模板可以定义一个对任何类型变量进行操 作的函数,从而大大增强了函数设计的通用性。使用函数模板 的方法是先说明函数模板,然后实例化成相应的模板函数进行 调用执行。 函数模板说明: 函数模板的一般说明形式如下: template <class 模板参数表> <返回值类型> <函数名>(模板函数形参表) { //函数定义体; } 其中,template是定义模板的关键字,<模板参数表>可 以包含基本数据类型,也可以包含类类型,如果类型形参多于 一个,则每个类型参数都要使用class,并且它们之间用逗号隔 开。<模板函数形参表>中的参数必须是惟一的
10.2画模板 函数模板定义不是一个实实在在的函数,编译系统不为 其产生任何执行代码。该定义只是对函数的描述,表示它每 次能单独处理在类型形式参数表中说明的数据类型。 # include≤ iostream.k template <class T> T max(TX, Ty d return(x>y?x:yi 结果 maino 3.4 d int x=3,y =4; double a= 1.2, b= 3.4 cout < max x, y<< endi cout < max(a, b)<< end; }
10.2 函数模板 函数模板定义不是一个实实在在的函数,编译系统不为 其产生任何执行代码。该定义只是对函数的描述,表示它每 次能单独处理在类型形式参数表中说明的数据类型。 #include <iostream.h> template <class T> T max(T x, T y) { return(x>y?x:y); } main() { int x = 3, y = 4; double a = 1.2, b = 3.4; cout << max(x, y) << endl; cout << max(a, b) << endl; } 结果: 4 3.4