模板

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() 函数以供调用。

 

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

 

posted @ 2020-09-07 17:17  祁峰_1024  阅读(179)  评论(0编辑  收藏  举报