zoukankan      html  css  js  c++  java
  • C++入门经典-例9.1-函数模板,函数模板的作用,使用数组作为模板参数

    1:函数模板不是一个实在的函数,因此编译器不能为其生成可执行的代码。定义函数模板只是一个对函数功能框架的描述,在具体执行时,将根据传递的实际参数决定其功能。

    2:函数模板定义的一般形式如下:

    template <类型形式参数> 返回类型 函数名(形式参数表)

    {

       ...//函数实现

    }

        其中template为关键字,表示定义一个模板,尖括号“<>”中为模板参数,模板参数主要有两种,一种是模板类型参数,另一种是模板非类型参数。上述代码中定义的模板使用的是模板类型参数,模板类型参数使用关键字class或typedef开始,其后是一个用户自定义的合法标识符。模板非类型参数和普通参数定义相同,通常为一个常数。

        可以将声明函数模板分成template部分和函数名部分。例如:

    template <class T>

    void fun(T t)

    {

        ...//函数实现

    }

        例如,下面的代码定义了一个求和的函数模板:

    template <class type>//定义一个模板类型

    type Sum(type xvar,type yvar)

    {

        return xvar+yvar;

    }

        在定义完函数模板之后,需要在程序中调用函数模板。下面的代码演示了Sum函数模板的调用。

    int iret=Sum(10,20);//实现两个整数的相加

    double dret=Sum(10,20.5);//实现两个实数的相加

        如果采用如下的形式调用Sum函数模板,将会出现错误。

    int iret=Sum(10.5,20);//错误的调用

    double dret=Sum(10,20.5);//错误的调用

        上述代码中为函数模板传递了两个类型不同的参数。导致编译器产生了歧义。如果在调用函数模板时显示表示模板类型就不会出现错误。例如:

    int iret=Sum<int>(10.5,20);//正确地调用函数模板

    double dret=Sum<double>(10,20.5);//正确地调用函数模板

        用函数模板生成实际可执行的函数又称为模板函数。函数模板与模板函数不是一个概念。从本质上讲,函数模板是一个“框架”,它不是真正可以编译生成代码的程序,而模板函数是把函数模板中的类型参数实例化后生成的函数,它和普通函数本质上是相同的,可以生成可执行代码。

    3:函数模板的作用

        假设求两个函数之中的最大者,如果想求整形数和实型数,那么需要定义两个函数,这两个函数定义如下:

    int max(int a,int b)

    {

        return a>b?a:b;

    }

    float max(float a,float b)

    {

        return a>b?a:b;

    }

        如果想通过一个max函数来完成既求整型数之间最大者又求实型数之间的最大者,则可以使用函数模板和#define宏定义来实现。

        #define宏定义可以在预编译期对代码进行替换。例如:

    #define max(a,b) ((a)>(b)?(a):(b))

        上述代码可以求整数最大值和实型数最大值。但宏定义#define只是进行简单替换,它无法对类型进行检查,有时计算结果可能不是想要的。

        使用模板函数求最大值的代码如下:

    template<class Type>

    Type max(Type a,Type b)

    {

        if(a>b)

            return a;

        else

            return b;

    }

        调用模板函数max可以分别正确地计算出整型数和实型数的最大值。例如:

    cout<<“最大值:”<<max(10,1)<<endl;

    cout<<“最大值:”<<max(200.05,100.4)<<endl;

    4:使用数组作为模板函数,代码如下:

    // 9.1.cpp : 定义控制台应用程序的入口点。
    //
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    template <class type,int len>                //定义一个模板类型
    type Max(type array[len])                    //定义函数模板
    {
        type ret = array[0];                    //定义一个变量
        for(int i=1; i<len; i++)                    //遍历数组元素
        {
            ret = (ret > array[i])? ret : array[i];    //比较数组元素大小
        }
        return ret;                            //返回最大值
    }
    void main()
    {
        int array[5] = {1,2,3,4,5};                //定义一个整型数组
        int iret = Max<int,5>(array);            //调用函数模板Max
        double dset[3] = {10.5,11.2,9.8};        //定义实数数组
        double dret = Max<double,3>(dset);        //调用函数模板Max
        cout << dret << endl;
    }
    View Code

    运行结果:

        程序中定义了一个函数模板Max,用来求数组中元素的最大值,其中,模板参数使用模板类型参数type和模板非类型参数len,参数type 声明了数组中的元素类型,参数len声明了数组中的元素个数,给定数组元素后,程序将数组中的最大值输出。

  • 相关阅读:
    Highmaps网页图表教程之图表配置项结构与商业授权
    架构要素--安全性
    Select * 一定不走索引是否正确?
    uvalive 6669 hidden tree(好壮压dp)
    KVM硬件辅助虚拟化之 EPT in Nested Virtualization
    HDU 1043 八数码(A*搜索)
    在夕阳再晨的日子里(二)----掌管市场部的岁月之合作团队与社区的拓展
    Android开发数据库之第三方ORM框架(GreenDao)
    【MySQL】常见错误与经常使用命令的集锦
    Service-监听手机来电
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7575674.html
Copyright © 2011-2022 走看看