传值函数:
int Abc(int a, int b, int c){
    return a+b+b*c+(a+b-c)/(a+b)+4;
}
模板函数:
template<class T> 
T  Abc(T  a, T  b, T  c){
	return a+b+b*c+(a+b-c)/(a+b)+4;
}

形式参数的用法会增加程序的运行开销

类型T 的复制构造函数把相应的实际参数分别复制到形式参数a,b和c之中,以供函数使用;而在函数返回时,类型
T的析构函数会被唤醒,以便释放形式参数a,b和c

  1: template<class T>
  2: T Abc(T& a, T& b, T& c){
  3:      return a+b+b*c+(a+b-c)/(a+b)+4;
  4: }

引用参数(reference parameter)

在函数被调用时,本程序并没有复制实际参数的值,在函数返回时也没有调用析构函数。

常量引用参数

常量引用(const reference),这种模式指出函数不得修改引用参数。

  1: template<class T>
  2: T Abc(const T& a, const T& b, const T& c)
  3: {
  4: return a+b+b*c+(a+b-c)/(a+b)+4;
  5: }

使用关键字const 来指明函数不可以修改引用参数的值,这在软件工程方面具有重要的意。这将立即告诉用户该函数并不会修改实际参数。

对于诸如i n t、float 和char 的简单数据类型,当函数不会修改实际参数值的时候我们可以采用传值参数;对于所有其他的数据类型(包括模板类型),当函数不会修改实际参数值的时候可以采用常量引用参数。

template<class Ta, class Tb, class Tc >
Ta Abc (const Ta& a, const Tb& b, const Tc& c)
{
        return a+b+b*c+(a+b-c)/(a+b)+4;
}
递归函数(recursive function)是一个自己调用自己的函数
累加求和
  1: template<class T>
  2: T Sum(T a[], int n){ 
  3:       / /计算a[0: n-1]的和
  4:     T tsum=0;
  5:     for (int i = 0; i < n; i++){
  6:            tsum += a[i];
  7:     }          
  8:     return tsum;
  9: }

递归求和:

template<class T>
T Rsum(T a[], int n){ 
	/ /计算a[0: n-1]的和
	if (n > 0)
		return Rsum(a, n-1) + a[n-1];
	return 0;
}