zoukankan      html  css  js  c++  java
  • 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 );  //循环内的简单运算

      } 

  • 相关阅读:
    BZOJ1819 [JSOI]Word Query电子字典 Trie
    洛谷2973 [USACO10HOL]赶小猪Driving Out the Piggi… 概率 高斯消元
    BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理
    BZOJ5047 空间传送装置 2017年9月月赛 最短路 SPFA
    BZOJ5045 打砖块 2017年9月月赛 其他
    BZOJ1858 [Scoi2010]序列操作 线段树
    BZOJ1826 [JSOI2010]缓存交换 堆 贪心
    BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵
    BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
    BZOJ1875 [SDOI2009]HH去散步 矩阵
  • 原文地址:https://www.cnblogs.com/ChinaEHR/p/2225026.html
Copyright © 2011-2022 走看看