模板
1 # include <iostream>
2 using namespace std;
3
4 template <typename T> //模板声明,其中T为类型参数
5
6 T max ( T t1, T t2 ,T t3){ //定义一个通用函数,用T作虚拟的类型名
7 if( t1 < t2 ) t1=t2 ;
8 if( t1 < t3 ) t1 = t3;
9 return t1;
10 }
11 /*
12 在使用带有默认参数的函数时有两点要注意:
13 1) 如果函数的定义在函数调用之前,则应在函数定义中给出默认值。如果函数的定义在函数调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时可以不给出默认值
14 2) 一个函数不能既作为重载函数,又作为有默认参数的函数。因为当调用函数时如果少写一个参数,系统无法判定是利用重载函数还是利用默认参数的函数,出现二义性,系统无法执行。
15
16 */
17 int getDefault(int i = 20 ){ // 有默认参数的函数
18
19 return i ;
20 }
21
22
23 int main (void){
24 int maxI = max(1,2,3); //调用模板函数,此时T被int取代
25
26 cout << "maxI = " << maxI << endl;
27 double maxd = max (1.1 , 2.2 , 3.3 ); //调用模板函数,此时T被double取代
28
29 cout << "maxd = " << maxd << endl;
30
31 int defaultValue = getDefault();
32
33 cout << "defaultValue = " << defaultValue << endl;
34
35 return 0 ;
36 }
37 /*
38 定义函数模板的一般形式为
39 template < typename T> 或 template <class T>
40 通用函数定义 通用函数定义
41
42 一个函数首部的int/double改为T即可。即用虚拟的类型名T代替具体的数据类型。在对程序进行编译时,遇到第13行调用函数max(1, 2, 3),
43 编译系统会将函数名max与模板max相匹配,将实参的类型取代了函数模板中的虚拟类型T。此时相当于已定义了一个函数:
44
45 int max(int a,int b,int c)
46 {if(b>a) a=b;
47 if(c>a) a=c;
48 return a;
49 }
50 然后调用它。后面两行(14,15行)的情况类似。
51 类型参数可以不只一个,可以根据需要确定个数。如
52 template <class T1,typename T2>
53 可以看到,用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数的参数个数相同而类型不同,且函数体相同的情况,如果参数的个数不同,则不能用函数模板。
54
55 */