• 模板


    1、为什么要使用模板?

    比如我现在想要获得两个数中较大的一个,那就有个问题,这是什么数?int?double?float?

    所以可能你需要用到函数重载

    //函数1.
    int max(int x,int y);
    {return(x>y)?x:y ;}
    
    //函数2.
    float max( float x,float y){
    return (x>y)? x:y ;}
    
    //函数3.
    double max(double x,double y)
    {return (c>y)? x:y ;}

    这种写法显然不太方便,所以这时候就可以用到模板。

    2、都有哪些模板?

     有    1、模板函数       2、模板类

    3、函数模板的使用

    3.1、首先看一下函数模板的格式:

    template <模板形参表>
    <返回值类型>  <函数名>(模板函数形参表)
    {
          //函数定义体
    }

    template 显然就是定义模板的关键字了。

    3.2套用这个格式,我们写一个模板函数

    template <typename T> 
    T const& max(T const &a, T const &b)
    {
        return a < b ? b : a;
    }

    typename也可以用class替换,用这个关键字定义类型

    3.3测试一下刚刚的函数

    #include <iostream>
    
    using namespace std;
    
    template <typename T>
    T const& max(T const &a, T const &b)
    {
        return a < b ? b : a;
    }
    
    int main()
    {
        int a1 = 5 ,b1 = 15;
        double a2 = 5.5, b2 = 5.6;
        char a3 = 'a', b3 = 'd';
    
        cout<<max(a1,b1)<<endl;
        cout<<max(a2,b2)<<endl;
        cout<<max(a3,b3)<<endl;
    
        return 0;
    }

    输出结果:

    15
    5.6
    d

    4、类模板

    4.1、类模板的格式

    template<typename T>
    class 类名 {
        //
    };

    和刚才的函数模板类似,template也是模板关键字,要想使用 通用的数据类型的 类成员/返回值/参数,则需要在定义其数据类型时使用T

    4.2学着这个格式写一个类

    template<typename T>
    class Compute
    {
    public:
        Compute(T a,T b);
        T max();
        T min();
        T add();
        T mul();
    
    private:
        T a,b;
    };

    其实和普通的类也没有什么区别,只不过是把一般的int char换成了T 用来代表所有的数据格式

    4.3实现这个类并且测试

    #include <iostream>
    
    using namespace std;
    
    //声明一个类模板,计算a b的一些相关值
    template<typename T>
    class Compute
    {
    public:
        Compute(T a,T b);
        T max();
        T min();
        T add();
        T mul();
    
    private:
        T a,b;
    };
    
    
    //构造函数
    template<typename T>
    Compute<T>::Compute(T a,T b)
    {
        this->a = a;
        this->b = b;
    }
    
    //下面四个成员函数
    template<typename T>
    T Compute<T>::max()
    {
        return a < b ? b : a;
    }
    
    template<typename T>
    T Compute<T>::min()
    {
        return a > b ? b : a;
    }
    
    template<typename T>
    T Compute<T>::add()
    {
        return a + b;
    }
    
    template<typename T>
    T Compute<T>::mul()
    {
        return a * b ;
    }
    
    
    
    
    int main()
    {
        //在使用类模板时,创建这个类的变量要声明创建的类型
        Compute<int> test(1,2);
        cout<<test.add()<<endl;
        cout<<test.min()<<endl;
        cout<<test.max()<<endl;
        cout<<test.mul()<<endl;
    
        Compute<char> test2('a','b');
        cout<<test2.add()<<endl;
        cout<<test2.min()<<endl;
        cout<<test2.max()<<endl;
        cout<<test2.mul()<<endl;
    
        return 0;
    }

    输出结果:

    3
    1
    2
    2
    
    a
    b
    "

    和想象中的基本差不多,a*b应该也不会有值输出。

    这里要特别注意构造函数成员函数的写法

    和类模板的使用方法!

    5、关于类模板的思考

     

    在第一个例子中,我们定义的max() 并不是一个函数,只有当他使用的时候,也就是执行到max(a1,b1); 这句的时候,他才成为一个函数,这个过程就是函数模板的实例化

    在第一个例子的第一句 max 中,编译器判断出此时的类型应该是int,所以生成了一个 int 版本的 max() 函数以供调用。

    同样的道理,模板类也需要实例化,所以在声明一个模板类的变量的时候,需要指定一个数据类型。

  • 相关阅读:
    uboot移植步骤详解
    使用busybox制作根文件系统(rootfs)
    DULG uboot解决问题的文档
    uboot的环境变量
    ASP.NET状态管理 APPlication,Session,Cookie和ViewStat用法
    WCF事务
    WCF中流的处理
    C#操作配置文件
    WCF实例模式和对象生命周期
    WCF中实例模式(InstanceContextMode)与会话模式(SessionMode)
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/13628001.html
Copyright © 2020-2023  润新知