20.3函数模板将根据实在参数表中的类型,确认是否匹配函数模板中对应的形式参数表然后,生成一个重载函数该重载函数的定义体与函数模板的函数定义体相同。而形式参数表的类型则以实在参数表的实际类型为依据该重载函数称为模板函数
• 将根据实在参数表中的类型,确认是否匹配 函数模板中对应的形式参数表。 • 然后,生成一个重载函数。 • 该重载函数的定义体与函数模板的函数定义 体相同。 • 而形式参数表的类型则以实在参数表的实际 类型为依据。 • 该重载函数称为模板函数
20.3函数模板函数模板与模板函数的区别函数模板是模板的定义,定义中使用通用类型参数。模板函数是实实在在的函数定义,由函数模板生成编译系统在发现具体的函数调用时,匹配类型参数,生成函数代码
函数模板与模板函数的区别: • 函数模板是模板的定义,定义中使用通用类 型参数。 • 模板函数是实实在在的函数定义,由函数模 板生成。 • 编译系统在发现具体的函数调用时,匹配类 型参数,生成函数代码
20.3函数模板例20-1:求两个数最大值的函数模板#include<iostream>#include<string>using namespace std;//模板声明,T为类型参数,或写成<typenameTtemplate< class T>TMax(Ta, Tb){return a>b ?a : b ;1
例20-1:求两个数最大值的函数模板 #include<iostream> #include<string> using namespace std ; //模板声明,T为类型参数,或写成< typename T > template < class T > T Max( T a , T b ) { return a > b ? a : b ; }
测试用主函数第一次使用函数模板Max()时,实参为整数,所以参void main()数类型T为int,返回值也{是int。int i1 = 3,i2 = 5 ;double d1 = 3.3, d2 = 5.2 ;string str1("xjtu"), str2("xian");cout << "Type int: " << Max(i1,i2) << endl ;cout << "Type double: " << Max(d1, d2)<< endl ;cout << "Type string: " << Max(str1, str2)<< endl ;第二次调用时,参数类型Tint:5Type为double。Typedouble:5.2Typestring:xjtu
//测试用主函数 void main( ) { int i1 = 3 , i2 = 5 ; double d1 = 3.3 , d2 = 5.2 ; string str1("xjtu") , str2("xian") ; cout << "Type int: " << Max(i1, i2) << endl ; cout << "Type double: " << Max(d1, d2) << endl ; cout << "Type string: " << Max(str1, str2) << endl ; } 第一次使用函数模板Max( )时,实参为整数,所以参 数类型T为int,返回值也 是int。 第二次调用时,参数类型T 为double
20.3函数模板定义函数模板时的注意事项:1、在函数模板的参数表中,至少有一个参数的类型为模板的类型参数2、函数的返回值的类型也可以是该类型参数。例如,TMax(Ta,T b)
定义函数模板时的注意事项: • 1、在函数模板的参数表中,至少有一个参 数的类型为模板的类型参数。 • 2、函数的返回值的类型也可以是该类型参 数。 例如,T Max( T a , T b )