模板

模板

 

 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 */

 

 

 

 

 

 

 

 

 

 

posted @ 2014-07-14 11:48  mjorcen  阅读(299)  评论(0编辑  收藏  举报