`
逆风的香1314
  • 浏览: 1396853 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++-模板

阅读更多
/**********************************************************************
*   <模板>                                                                                               
*模板是一种参数化的类或函数,也就是类的形态或者函数的形态可以被参数改变.
**********************************************************************
*/


/**//**********************************************************************
*  <模板函数>  
*/
                                                                                             

 template 
<class T> T funname(para type)

/**//*自我理解:
*       如果要计算int型和float型数组的平均值,可以分别写int_average(int nVal,*int size)和
*float_average(int nVal,int size)两个函数,但其实它们里面的步骤是一*样的,只是数据类型
*不同,如果使用模板,就不需要这么麻烦了。
**********************************************************************
*/

//例1:
 template <class T> average(T *array,int size) 
 
...{
  T sum 
= 0;
  
for(int i=0;i<size;i++)
   sum 
+= array[i];
  T avg 
= sum/size;
  
return avg;
 }
;
//"<class T>"告诉编译器"T"是函数使用的数据类型。

//提示:模板函数最好写在头文件中,但必须要写在main()前面

//例2:
 template <class T>
 T max(T x,T y) 
//传入的参数改必须是同类型的
 ...{
  
return (x>y)  ? x:y;
 }


 
void main()
 
...{
  
double a = 50.235;
  
double b = 50.234;
  
double c = max(a,b);
  cout
<<"最大值="<<c<<endl;
 }


//函数模板经实例化所生成的具体函数叫"模板函数";
//例如例1,可以实例化成 average(int,int)、average(float,float)、average(char,char) 等等...
//每一个模板形参前必须有"class"关键字!
//在template语句与函数模板语句之间不允许有别的语句;


/**//**********************************************************************
*  <多类型模板函数>  
*
*       如上题数组,若数组中所有元素之和超过类型范围怎么办?可用多类型*函数模板解决 
**********************************************************************
*/

//例:
 template <class T1,class T2>
 T1 average(T1 
*array,T2,int size)//声明函数模板
 ...{
  T2 sum 
= 0;   
  
for(int i=0;i<size;i++)
   sum
+=array[i];
  
return(sum/i);
 }

 
void main()
 
...{
  __int16 intArray[]
=...{10000,20000,30000}// 范围 -32768 - 32767
  cout<<"整数平均值="<<::average(intArray,3)<<endl;
 }


/**//* 自我理解
    此例中,当T1接收了__int16 intArray[]后,它俨然就成了__int16型了,但要命的是,数组中的
数字相加后,会超界,so...再定义一个T2,用T2来接收相加后的的数据,T2会根据数据的大小来
确定自己的类型。 
*/



/**//**********************************************************************
*  <模板函数的重载>  
*       因为模板函数需要接收同类型的参数,要是参数类型不一致怎么办?可以使用函数重载.
**********************************************************************
*/

 template
<class T>

 T max(T x,T y) 
//传入的参数改必须是同类型的
 ...{
  
return (x>y) ? x:y ;
 }


 
int max(int x ,char y) //重载函数 max,一个整型参数,一个字符型参数
 ...{
  
return (x>y) ? x:y ;
 }


 
void main()
 
...{
  
int a = 55;
//     int b = 66;
  char b = 'A'//ASCII 码 65
  cout<<"最大值="<<max(a,b)<<endl;  //此处将调用重载函数
 }



/**//**********************************************************************
*  <类模板>  
**********************************************************************
*/

 
const int size = 10;
 template 
<class T>
 
class stack
 
...{
  T stck[size]; 
//模板定义数组的数据类型
 public:
  
//若成员函数中使用了模板,则此函数需要在类体外定义!!!
  void push(T ch); //模板定义形参类型
  T pop(); //模板定义返回类型
 }
;

 template 
<class T>  //注意:在类体外实现成员函数时的写法!!!
 void stack<T>::push(T ob)
 
...{
 }


 template 
<class T> //注意:在类体外实现成员函数时的写法!!!
 T stack<T>::pop()
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics