VC++ (五)特殊函数形式

1、函数模板(template)

当需要定义多个具有相同函数名的函数时,需要进行函数重载(overload)。函数重载的条件是这些函数的形参列表各不相同。事实上,所有函数都有签名,函数的签名由函数名称和形参列表确定,程序中每个函数都必须有唯一的签名。同理,不同的返回值类型不足以区别函数。

当多个函数重载时,仅仅因为变量和形参类型不同,而算法和流程一致,为避免对每个函数重复编写本质上相同的代码,可以采用函数模板。如下:

  template<typename T>

  T Max(T x[], int len){

    T result = x[0];

    for(int i = 1; i<len; i++)

      if(result < x[i]) result = x[i];

    return result;

  }

调用时如下:

  int iValus[] = {1,2,3,4};

  double dValues[] = {0.1,0.2,0.3,0.4};

  int iMax = Max(iValues, 4);

  double dMax = Max(dValues, 4);

编译器会自动识别并生成相应代码。

2、泛型函数(generic)

泛型函数的作用与函数模板相似,但工作原理上有很大不同:使用函数模板时,编译器根据模板生成需要的函数的源代码,然后与其他代码一起编译,在某些情况下,将导致许多函数的产生,从而使执行模块的体积增大。而泛型函数本身将被编译器编译,当调用某个与泛型函数说明匹配的函数时,实际类型将在运行时替代类型形参,这样一来没有额外代码在编译时生成。泛型函数的定义与函数模板类似,如下:

  generic<typename T> where T:IComparable

  T Max(array<T>^ x){

    T result = x[0];

    for(int i= 1;i< x->Length; i++)

      if(result->CompareTo(x[i]) < 0) result= x[i];

    return result;

  }

关键字where后面内容,是对在使用泛型函数时,用于替代T的实际类型的约束条件,在此处表示该类型必需实现IComparable接口。

3、内联函数(inline)

当函数定义为内联函数时,编辑器将设法以函数体代码替代函数调用,所以内联函数最适合用于非常短小的、频繁调用的简单函数,如循环体内的简单函数调用等。通过内联函数可以避免调用函数时的系统开销,从而加速代码运行。如:

  inline double Multiplication(double dA, double dB) { return dA * dB};

  double dM = 0;

  int i;

  for (i=0;i<10000;i++){

    dM += Multiplication(PI, i / 0.123 );  //循环内的简单运算

  } 

posted @ 2011-10-26 12:48  玻璃城市  阅读(306)  评论(0编辑  收藏  举报