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 );  //循环内的简单运算

      } 

  • 相关阅读:
    资料收集
    layui 设计资源——2.0 版本的 Axure 组件包,产品交互设计利器
    照片自动按时间分类助手
    回顾2017,规划2018,展望2019
    coder/programmer engineer Chirf Technology Offcer
    新手开公司创业,这些坑千万别掉进去!
    ASP.NET MVC中的Global.asax文件
    SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.0
    快速开发之代码生成器(asp.net mvc4 + easyui + knockoutjs)
    PowerDesigner逆向工程导入MYSQL数据库总结
  • 原文地址:https://www.cnblogs.com/ChinaEHR/p/2225026.html
Copyright © 2011-2022 走看看